Форум 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=176976)

Nikolay00700 21.03.2012 22:50

наследование, одна переменная у родителя - у детей эта переменная разная
 
Сделал базовый класс Button, который содержит определенный набор свойств и методов

Код AS3:

class Button extends Sprite{
 
        public var pict:Sprite=new Sprite();       
 
        public function Button ()
        {
                    addChild(pict);
        }
 
        public function SetX ():void
        {
                    pict.x= 200;
        }
 
}


И два класса, которые будут наследовать методы и свойства от этого класса, вот только переменная pict должна стать другой.



Код AS3:

class Button1 extends Button{
 
        public var pict:black=new black();        //black - класс картинки из библиотеки
 
        public function Button1 ()
        {
                  this.x=100;
                  this.y=50;
        }
 
}


Код AS3:

class Button2 extends Button{
 
        public var pict:green=new green();        //green - класс картинки из библиотеки
 
        public function Button2 ()
        {
                  this.x=100;
                  this.y=50;
        }
 
}

Что я делаю не так?

КорДум 21.03.2012 22:53

Перенесите создание экземпляров картинок в конструкторы.

Nikolay00700 21.03.2012 23:09

переписал таким образом.
Проблема в том, что он работает только с теми экземплярами, которые создал в конструкторе базового класса. А мне нужно, чтобы всё то, что проделывается в конструкторе базового класса, проходило с переменными созданными в детях.

Код AS3:

class Button extends Sprite{
 
        public var pict:Sprite;       
 
        public function Button ()
        {
              pict=new Sprite();                           
              addChild(pict);
        }
 
        public function SetX ():void
        {
                    pict.x= 200;
        }
 
}


Код AS3:

class Button1 extends Button{
 
 
 
        public function Button1 ()
        {
                  pict=new black();        //black - класс картинки из библиотеки                 
                  this.x=100;
                  this.y=50;
        }
 
}

Код AS3:

class Button2 extends Button{
 
 
        public function Button2 ()
        {
                  pict=new green();        //green - класс картинки из библиотеки
                  this.x=100;
                  this.y=50;
        }
 
}

Я вижу один выход. Например содержимое класса родителя вынести в отдельную функцию, за минусом создания экземпляров.
И в конструкторе детей вызывать эту функцию...

Но что-то мне это не нравится... Мне кажется должно быть иначе...

КорДум 21.03.2012 23:15

Да, вынесите в init(), в наследниках переопределяйте этот метод. Это нормально.
Только не обязательно вызывать в каждом ребенке этот метод. Достаточно только в super (базовом).

Inet_PC 21.03.2012 23:18

Можно в конструктор параметром передать:
Код AS3:

public function Button (value: Sprite=null)
{
        pict=value || new Sprite();                           
        addChild(pict);
}

Можно так:
Код AS3:

public function Button ()
{
        pict||=new Sprite();                           
        addChild(pict);
}

Но лучше слушайте, что Вам говорит КорДум!

Nikolay00700 21.03.2012 23:22

Но работает правильно только тогда, когда вызываю эту функцию в конструкторе у каждого ребенка. Если вызываю эту функцию в конструкторе базового класса, то он опять работает только с экземплярами созданными в конструкторе базового класса...

КорДум 21.03.2012 23:23

Наверняка вы не переопределяете метод.
Сейчас набросаю пример на коленке. Одну минуту.

Добавлено через 2 минуты
Код AS3:

class ButtonBase() {
    public function ButtonBase() {
        init();
    }
 
    protected function init():void {
        // какой-то код
    }
}

Код AS3:

class Button extends ButtonBase() {
    public function ButtonBase() {
        super();
    }
 
    override protected function init():void {
        // какой-то ДРУГОЙ код
    }
}

Код AS3:

new Button();

В результате чего init() вызовется как бы в классе родителя, но это будет ПЕРЕОПРЕДЕЛЕННЫЙ метод.

Nikolay00700 21.03.2012 23:26

Inet_PC -
такая же ситуация... работает с экземплярами которые создаются в базовом классе... т.к. конструктор базового класса запускается раньше...

Добавлено через 6 минут
Тогда получается, что создание экземпляра pict мне в init писать?

КорДум 21.03.2012 23:37

Верно.

Nikolay00700 21.03.2012 23:39

И не работает. Я сделал изменения в эту сторону.

Error: Access specifiers are not allowed with namespace attributes.
Error: Incompatible override.
Error: Overriding a function that is not marked for override.
Я наверное что-то не так делаю...


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

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