Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 16.09.2013, 13:02
Isfet вне форума Посмотреть профиль Отправить личное сообщение для Isfet Найти все сообщения от Isfet
  № 1  
Ответить с цитированием
Isfet

Регистрация: Mar 2012
Адрес: г.Новосибирск
Сообщений: 381
По умолчанию Возможно ли динамически наследовать классы

Допустим есть Json- объект, при его парсении вытаскиваю свойства рисуемых объектов, допустим свойство type, если type = 1, то наследовать DrawObject от Shape, если 2 , то от Sprite. Можно ли такое сделать?

Старый 16.09.2013, 13:46
Babylon вне форума Посмотреть профиль Отправить личное сообщение для Babylon Посетить домашнюю страницу Babylon Найти все сообщения от Babylon
  № 2  
Ответить с цитированием
Babylon
[+1 25.10.13]
[+4 18.03.14]
 
Аватар для Babylon

Регистрация: Jan 2006
Адрес: Москва, Зеленоград
Сообщений: 653
Отправить сообщение для Babylon с помощью ICQ
Нет конечно, но ты можешь сделать фабрику инстансов классов, имплементирующих предопределенный интерфейс IDrawObject

Старый 16.09.2013, 22:06
MikroAcse вне форума Посмотреть профиль Отправить личное сообщение для MikroAcse Найти все сообщения от MikroAcse
  № 3  
Ответить с цитированием
MikroAcse
 
Аватар для MikroAcse

Регистрация: Feb 2012
Сообщений: 1,540
Только в haxe и только при компиляции.

Старый 16.09.2013, 22:37
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 4  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
по моему при компиляции - это не динамически

Цитата:
Допустим есть Json- объект, при его парсении вытаскиваю свойства рисуемых объектов, допустим свойство type, если type = 1, то наследовать DrawObject от Shape, если 2 , то от Sprite. Можно ли такое сделать?
Что-то подсказывает, что не нужно здесь фокусов с наследованием, а надо просто взять и решить задачу.
Код AS3:
public class Parser
{
    private static function parseCommon(object:DisplayObject, json:Object):void {
        object.x = json["x"];
        object.y = json["y"];
        ...
    }
    private static function parseSpritePart(sprite:Sprite, json:Object):void {
        for each (var i:Sprite in json["childs"]) {
            sprite.addChild(NewDisplayObject(i));
        }
    }
    public static function newDisplayObject(json:Object):DisplayObject {
        if (json["type"] == "Sprite") {
            var sprite:Sprite = new Sprite();
            ParseCommon(sprite, json);
            ParseSpritePart(sprite, json);
            return sprite;
        }
        if (json["type"] == "Shape") {
            var shape:Shape = new Shape();
            ParseCommon(shape, json);
            return shape;
        }
        return null;
    }
}
...
DisplayObject object = Parser.newDisplayObject(JSON.parse(text));


Последний раз редактировалось expl; 16.09.2013 в 22:47.
Старый 17.09.2013, 01:18
in4core вне форума Посмотреть профиль Отправить личное сообщение для in4core Найти все сообщения от in4core
  № 5  
Ответить с цитированием
in4core
[+4 06.05.14]
 
Аватар для in4core

Регистрация: Mar 2009
Сообщений: 4,219
Записей в блоге: 14
expl последняя строчка) на какой язык перешел?
__________________
Марк Tween

Старый 17.09.2013, 11:43
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 6  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
на хороший
*
Код AS3:
var object:DisplayObject = Parser.newDisplayObject(JSON.parse(text));

Старый 17.09.2013, 13:46
Isfet вне форума Посмотреть профиль Отправить личное сообщение для Isfet Найти все сообщения от Isfet
  № 7  
Ответить с цитированием
Isfet

Регистрация: Mar 2012
Адрес: г.Новосибирск
Сообщений: 381
Цитата:
Сообщение от expl Посмотреть сообщение
Что-то подсказывает, что не нужно здесь фокусов с наследованием, а надо просто взять и решить задачу.
Да, фабричный метод хорош, но в том то и дело, что кроме основного функционала классов Sprite и Shape, он должен еще содержать функционал класса DrawObject.

Чтобы не делать 2 класса DrawObjectShape и DrawObjectSprite , в которых будет одинаковый код

Старый 17.09.2013, 22:13
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 8  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Цитата:
Да, фабричный метод хорош, но в том то и дело, что кроме основного функционала классов Sprite и Shape, он должен еще содержать функционал класса DrawObject.
Ну и отлично, добавляем метод:
Код AS3:
private static function parseDrawableObject(Graphics g, json:Object):void {
        g.lineStyle(0, json["color"]);
        g.drawCircle(json["circle_x"], json["circle_y"], json["radius"]);
}
И добавляем 2 строчки в основную функцию:
Код AS3:
public static function newDisplayObject(json:Object):DisplayObject {
        if (json["type"] == "Sprite") {
            var sprite:Sprite = new Sprite();
            ParseCommon(sprite, json);
            ParseSpritePart(sprite, json);
            ParseDrawableObject(sprite.graphcis, json);// раз
            return sprite;
        }
        if (json["type"] == "Shape") {
            var shape:Shape = new Shape();
            ParseCommon(shape, json);
            ParseDrawableObject(sprite.graphcis, json);// два
            return shape;
        }
        if (json["type"] == "TextField") {
            var tf:TextField = new TextField();
            ParseCommon(tf, json);
            ...
            // А сюда не добавляем
            return tf;
        }
        return null;
    }
Цитата:
Чтобы не делать 2 класса DrawObjectShape и DrawObjectSprite , в которых будет одинаковый код
А где мы здесь вообще делаем новые классы?

Цитата:
Да, фабричный метод хорош
Это не фабричный метод, это тупая декомпозиция на функции. Часто тупое решение - оно самое верное.
Паттерном "фабричный метод" называют несколько другое:
http://ru.wikipedia.org/wiki/%D0%A4%...D%D0%B8%D1%8F)

Хотя здесь можно назвать Parser статической фабрикой, а newDisplayObject - методом статичной фабрики (просто названия совпадают паттерна и метода, хотя здесь ситуация совсем не похожа на фабричный метод - у нас тут никакие методы не перегружаются в подклассах, у нас тут вообще один класс и тот статичный, его, конечно, при необходимости, можно сделать нестатичным, тут не принципиально)

P.S. Если вас напрягает добавление этих -2х строчек, у вас куча объектов со своими особенностями парсинга/перевода обратно в JSON и вы хотите более гибко добавлять эти объекты - могу подсказать как этого добиться с наследованием и прочими извращениями. Но если у вас 5 - 10 типов объектов, и добавление новых - редкость - решение с простыми функциями - самое лучшее.


Последний раз редактировалось expl; 17.09.2013 в 22:27.
Старый 18.09.2013, 00:00
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 9  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
В любом случае Вы не можете наследоваться от нескольких/разных классов.
Можно заморочиться и заменить наследование композицией, но по-моему проще продублировать код, особенно если для Вас критична разница (по весу?) между Спрайтом и Шейпом (то какой-то еще экземпляр на борту это уж тем более перебор).
__________________
Reality.getBounds(this);

Создать новую тему Ответ Часовой пояс GMT +4, время: 17:51.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 17:51.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.