|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Регистрация: Mar 2012
Адрес: г.Новосибирск
Сообщений: 381
|
Возможно ли динамически наследовать классы
Допустим есть Json- объект, при его парсении вытаскиваю свойства рисуемых объектов, допустим свойство type, если type = 1, то наследовать DrawObject от Shape, если 2 , то от Sprite. Можно ли такое сделать?
|
|
|||||
[+1 25.10.13]
[+4 18.03.14] |
Нет конечно, но ты можешь сделать фабрику инстансов классов, имплементирующих предопределенный интерфейс IDrawObject
|
|
|||||
Регистрация: Feb 2012
Сообщений: 1,540
|
Только в haxe и только при компиляции.
|
|
|||||
по моему при компиляции - это не динамически
Цитата:
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. |
|
|||||
Регистрация: Mar 2012
Адрес: г.Новосибирск
Сообщений: 381
|
Цитата:
Чтобы не делать 2 класса DrawObjectShape и DrawObjectSprite , в которых будет одинаковый код |
|
|||||
Цитата:
private static function parseDrawableObject(Graphics g, json:Object):void { g.lineStyle(0, json["color"]); g.drawCircle(json["circle_x"], json["circle_y"], json["radius"]); } 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; } Цитата:
Цитата:
Паттерном "фабричный метод" называют несколько другое: 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. |
|
|||||
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
В любом случае Вы не можете наследоваться от нескольких/разных классов.
Можно заморочиться и заменить наследование композицией, но по-моему проще продублировать код, особенно если для Вас критична разница (по весу?) между Спрайтом и Шейпом (то какой-то еще экземпляр на борту это уж тем более перебор).
__________________
Reality.getBounds(this); |
Часовой пояс GMT +4, время: 17:51. |
|
« Предыдущая тема | Следующая тема » |
|
|