Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Помогите разобраться с наследованием и переопределением (http://www.flasher.ru/forum/showthread.php?t=212950)

neonoviiwolf 01.06.2016 19:26

Помогите разобраться с наследованием и переопределением
 
Доброго!
Пришло время повторного использования классов и переопределение методов, но вот беда, я так и не понял как это правильно делать
вот отрывок класса родителя

Код AS3:

package singleton.sGroundUnits.bankMucus
{
        import classesGame.killUnits.KillGroundUnit;
        import classesGame.options.OptionsUnits;
        import IParentCommon;
        import flash.events.Event;
        import nape.phys.Body;
        import nape.phys.BodyType;
        import nape.shape.Polygon;
 
        public class BankMucus extends IParentCommon
        {
                protected var body:Body;
 
                public function BankMucus()
                {
                        body = new Body(BodyType.KINEMATIC);
                        body.shapes.add(new Polygon(Polygon.box(35, -35)));
                        body.align();
                        body.userData.tempSpeed = 0;
                }
 
                private var sprite:bankMukus_mc = new bankMukus_mc();
 
                override public function init(e:Event):void
                {
                        super.init(e);
 
                        sprite.scaleY = 0.8;
                        this.addChild(sprite);
                        this.addEventListener(Event.ENTER_FRAME, updateSprite);
                        this.addChild(new KillGroundUnit(sprite, body));
                }
 
                protected function updateSprite(e:Event):void
                {
                        sprite.x = body.position.x - sprite.width / 2;
                        sprite.y = body.position.y - sprite.height / 2;
                }
 
                public function get getBody():Body
                {
                        return body;
                }
 
                public function get getSprite():bankMukus_mc
                {
                        return sprite;
                }
 
                public function get getLength():uint
                {
                        return OptionsUnits.lengthBankMucus;
                }
 
                override public function removeInit(e:Event):void
                {
                        super.removeInit(e);
                        this.removeChild(sprite);
                        this.removeEventListener(Event.ENTER_FRAME, updateSprite);
                }
        }
}

мне нужно создать почти такой же класс, только заменить sprite надобно

Код AS3:

package singleton.sGroundUnits.fatso
{
        import classesGame.options.OptionsUnits;
        import flash.events.Event;
        import singleton.sGroundUnits.bankMucus.BankMucus;
 
        public class Fatso extends BankMucus
        {
 
                public function Fatso()
                {
                }
 
                private var sprite:fatso_mc = new fatso_mc();
 
                override public function init(e:Event):void
                {
                        super.init(e);
                }
 
                override public function get getLength():uint
                {
                        return OptionsUnits.lengthFatso;
                }
        }
}

и чёт болты, ни на что не ругается, просто не работает. Чё я делаю не так?

undefined 01.06.2016 19:42

переопределять можно только методы.Решение - описывай свой спрайт как private var sprite:MovieClip и выноси его инициализацию в конструктор/спец. метод(типа init)

Добавлено через 3 минуты
ПС: в конструкторе класса-наследника принято вызывать конструктор супер-класса.(относится к обоим классам)

illuzor 01.06.2016 20:21

Можно сделать sprite protected и инициализировать его, например, в конструкторе Fatso().
Больше ничего не нужно.
Хотя, тогда не понятно, зачем делать отдельный класс ради изменения одной переменной

neonoviiwolf 01.06.2016 20:31

я так сделал, заработало, лучше как можно?
Код AS3:

        public class BankMucus extends IParentCommon
        {
                protected var body:Body;
                private var sprite:MovieClip;
 
                public function BankMucus()
                {
                        body = new Body(BodyType.KINEMATIC);
                        body.shapes.add(new Polygon(Polygon.box(35, -35)));
                        body.align();
                        body.userData.tempSpeed = 0;
                        sprite = newSprite()
                }
 
                protected function newSprite():MovieClip
                {
                        return  new bankMukus_mc();
                }
 
                override public function init(e:Event):void
                {
                        super.init(e);
 
                        sprite.scaleY = 0.8;
                        this.addChild(sprite);
                        this.addEventListener(Event.ENTER_FRAME, updateSprite);
                        this.addChild(new KillGroundUnit(sprite, body));
                }

Код AS3:

package singleton.sGroundUnits.fatso
{
        import classesGame.options.OptionsUnits;
        import flash.display.MovieClip;
        import flash.events.Event;
        import singleton.sGroundUnits.bankMucus.BankMucus;
 
        public class Fatso extends BankMucus
        {
 
                public function Fatso()
                {
                        super();
                }
 
                override protected function newSprite():MovieClip
                {
                        return new fatso_mc;
                }
 
                override public function init(e:Event):void
                {
                        super.init(e);
                }
 
                override public function get getLength():uint
                {
                        return OptionsUnits.lengthFatso;
                }
        }
}


illuzor 01.06.2016 21:59

neonoviiwolf, можно, но смысл происходящего не понятен.

neonoviiwolf 01.06.2016 22:33

Цитата:

Сообщение от illuzor (Сообщение 1194508)
neonoviiwolf, можно, но смысл происходящего не понятен.

а чё не понятного, создаётся физ объект, к нему цепляется мувик, ну и методы get/set

undefined 01.06.2016 23:13

непонятно зачем тут наследование.Если объекты будут отличаться только этим спрайтом, лучше сделать один класс с возможностью устанавливать ему это свойство.

illuzor 01.06.2016 23:47

Цитата:

Сообщение от undefined (Сообщение 1194510)
непонятно зачем тут наследование.Если объекты будут отличаться только этим спрайтом, лучше сделать один класс с возможностью устанавливать ему это свойство.

Именно. Наследование для этой задачи не нужно.

neonoviiwolf 02.06.2016 10:45

Цитата:

Сообщение от illuzor (Сообщение 1194511)
Именно. Наследование для этой задачи не нужно.

ну у меня много юнитов будет, остальные будут отличаться сильнее

Wolsh 02.06.2016 13:22

Еще раз:
Переопределение касается методов, функций, действий. НЕ свойств.
Если ваши юниты будут ПО-РАЗНОМУ выполнять команду стреляй(), то смысл есть.
Если разница будет только в том, что один делает стреляй(простоПуля) а другой стреляй(серебрянаяПуля), то разница опять только в свойствах и переопределение не нужно.
Если выполняются одни и те же действия, но с разными объектами или параметрами, то они так и остаются одними и теми же действиями.
Поэтому, чтобы разбираться с темой топика, нужен правильный пример, где действительно используется переопределение метода. Иначе будет только путаница.


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

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