![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: Jul 2008
Адрес: Украина, Киев
Сообщений: 253
|
Всем доброго времени суток.
Есть такая иерархия классов: BaseObject - содержит базовые свойства, присущие всем объектам игрового мира WorldObject - наследник класса BaseObject, основная графическая единица игры У обоих этих объектов есть метод clone(), который создает и возвращает копию этого объекта. Вопрос в том, как правильно реализовать эту функцию в классе WorldObject, чтобы: свойства, присущие классу BaseObject копировались в его функции clone(), а свойства, присущие классу WorldObject, копировались в его функции clone()? Самое лучшее, что придумалось, выглядит так: public class BaseObject { private var identifier:String; private var objectType:uint; private var objectName:String; public function clone(baseObjectPtr:BaseObject = null):BaseObject { baseObjectPtr.id = id; baseObjectPtr.name = name; baseObjectPtr.type = type; return null; } public function get id():String { return identifier; } public function set id(value:String):void { identifier = value; } public function get name():String { return objectName; } public function set name(value:String):void { objectName = value; } public function get type():uint { return objectType; } public function set type(value:uint):void { objectType = value; } } |
|
|||||
|
Регистрация: Apr 2010
Адрес: Earth
Сообщений: 1,897
|
Есть такой вариант:
public class BaseObject { ............... public function clone():BaseObject { var _clone:BaseObject = new BaseObject(); _clone._copyFrom_BaseObject( this ); return _clone; } protected function _copyFrom_BaseObject( source:BaseObject ):void { this.id = source.id; this.name = source.name; this.type = source.type; } ............... } public class WorldObject extends BaseObject { private var currAnim:String; override public function clone():BaseObject { return cloneAsWorldObject(); } public function cloneAsWorldObject():WorldObject { var _clone:WorldObject = new WorldObject(); _clone._copyFrom_WorldObject( this ); return _clone; } protected function _copyFrom_WorldObject( source:WorldObject ):void { this._copyFrom_BaseObject( source ); this.currAnim = source.currAnim; } } |
|
|||||
|
Регистрация: Apr 2010
Адрес: Earth
Сообщений: 1,897
|
Ну как, подходит?
|
|
|||||
|
Регистрация: Jul 2008
Адрес: Украина, Киев
Сообщений: 253
|
да как то тоже не очень по ООП-шному ). Луче уж тогда просто описывать все поля в самом классе WorldObject (и его собственные и из базового класса), просто не вызывая super.clone() вообще
|
|
|||||
public function clone(baseObjectPtr:BaseObject = null):BaseObject { baseObjectPtr.id = id; baseObjectPtr.name = name; baseObjectPtr.type = type; return baseObjectPtr; } override public function clone(baseObjectPtr:BaseObject = null):BaseObject { var dublicate:WorldObject = super.clone(new WorldObject()) as WorldObject; dublicate.currAnim = currAnim; return duplicate; } Это что бы работало, а вообще baseObjectPtr можно было бы создавать в самой функции clone, а не параметром передавать.
__________________
ranga Последний раз редактировалось incvizitor; 31.05.2010 в 19:38. |
|
|||||
|
Modus ponens
|
Как раз тот случай когда пригодились бы виртуальные методы. Вообще, я думаю, что параметр функции клонирования ни к чему, проще жить будет если она сама все что ей нужно будет создавать.
__________________
Hell is the possibility of sanity |
|
|||||
|
Регистрация: Apr 2010
Адрес: Earth
Сообщений: 1,897
|
incvizitor, неувязочка небольшая получилась: в BaseObject клонируется исключительно в переданный объект (и нового не создается), а в WorldObject переданная ссылка нигде и не используется. Логика то метода разная получается - нехорошо ))
Последний раз редактировалось i.o.; 31.05.2010 в 20:38. |
|
|||||
|
Modus ponens
|
Только так не скомпилируется, да и проще мижно:
Только все равно смысла в этом не много, т.как если нужно переопределить этот метод, то толку от всех этих ухищрений будет не много. Легче просто создать новый экземпляр нужного типа в переопределенном методе, и понятнее будет, и потом не будете удивлятся почему каст не проходит.
__________________
Hell is the possibility of sanity |
|
|||||
|
блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
|
Во флэше они ж, как и в яве, все виртуальные, не? Как в шарпе/яве/с++ лучше сделать-то?
PS: для веселухи метод с writeObject: public function clone():Base { var b:ByteArray = new ByteArray(); registerClassAlias("Base", (this as Object).constructor as Class); b.writeObject(this); b.position = 0; return b.readObject(); } public override function clone():Base { var b:ByteArray = new ByteArray(); registerClassAlias("Derived", (this as Object).constructor as Class); b.writeObject(this); b.position = 0; return b.readObject(); } Последний раз редактировалось -De-; 31.05.2010 в 22:03. |
![]() |
![]() |
Часовой пояс GMT +4, время: 12:56. |
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | |
| Опции просмотра | |
|
|