Просмотр полной версии : наследование, одна переменная у родителя - у детей эта переменная разная
Nikolay00700
21.03.2012, 22:50
Сделал базовый класс Button, который содержит определенный набор свойств и методов
class Button extends Sprite{
public var pict:Sprite=new Sprite();
public function Button ()
{
addChild(pict);
}
public function SetX ():void
{
pict.x= 200;
}
}
И два класса, которые будут наследовать методы и свойства от этого класса, вот только переменная pict должна стать другой.
class Button1 extends Button{
public var pict:black=new black(); //black - класс картинки из библиотеки
public function Button1 ()
{
this.x=100;
this.y=50;
}
}
class Button2 extends Button{
public var pict:green=new green(); //green - класс картинки из библиотеки
public function Button2 ()
{
this.x=100;
this.y=50;
}
}
Что я делаю не так?
Перенесите создание экземпляров картинок в конструкторы.
Nikolay00700
21.03.2012, 23:09
переписал таким образом.
Проблема в том, что он работает только с теми экземплярами, которые создал в конструкторе базового класса. А мне нужно, чтобы всё то, что проделывается в конструкторе базового класса, проходило с переменными созданными в детях.
class Button extends Sprite{
public var pict:Sprite;
public function Button ()
{
pict=new Sprite();
addChild(pict);
}
public function SetX ():void
{
pict.x= 200;
}
}
class Button1 extends Button{
public function Button1 ()
{
pict=new black(); //black - класс картинки из библиотеки
this.x=100;
this.y=50;
}
}
class Button2 extends Button{
public function Button2 ()
{
pict=new green(); //green - класс картинки из библиотеки
this.x=100;
this.y=50;
}
}
Я вижу один выход. Например содержимое класса родителя вынести в отдельную функцию, за минусом создания экземпляров.
И в конструкторе детей вызывать эту функцию...
Но что-то мне это не нравится... Мне кажется должно быть иначе...
Да, вынесите в init(), в наследниках переопределяйте этот метод. Это нормально.
Только не обязательно вызывать в каждом ребенке этот метод. Достаточно только в super (базовом).
Можно в конструктор параметром передать:
public function Button (value: Sprite=null)
{
pict=value || new Sprite();
addChild(pict);
}
Можно так:
public function Button ()
{
pict||=new Sprite();
addChild(pict);
}
Но лучше слушайте, что Вам говорит КорДум!
Nikolay00700
21.03.2012, 23:22
Но работает правильно только тогда, когда вызываю эту функцию в конструкторе у каждого ребенка. Если вызываю эту функцию в конструкторе базового класса, то он опять работает только с экземплярами созданными в конструкторе базового класса...
Наверняка вы не переопределяете метод.
Сейчас набросаю пример на коленке. Одну минуту.
Добавлено через 2 минуты
class ButtonBase() {
public function ButtonBase() {
init();
}
protected function init():void {
// какой-то код
}
}
class Button extends ButtonBase() {
public function ButtonBase() {
super();
}
override protected function init():void {
// какой-то ДРУГОЙ код
}
}
new Button();
В результате чего init() вызовется как бы в классе родителя, но это будет ПЕРЕОПРЕДЕЛЕННЫЙ метод.
Nikolay00700
21.03.2012, 23:26
Inet_PC -
такая же ситуация... работает с экземплярами которые создаются в базовом классе... т.к. конструктор базового класса запускается раньше...
Добавлено через 6 минут
Тогда получается, что создание экземпляра pict мне в init писать?
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.
Я наверное что-то не так делаю...
Nikolay00700
21.03.2012, 23:43
Про ошибки - это я напутал...
ошибок нет... но всё также. работает с экземплярами созданными в базовом...
Тогда ждите, набросаю Вам простенький пример уже не на коленке.
Nikolay00700
21.03.2012, 23:47
он даже не с теми экземплярами работает... а вообще не поймешь что отображает....
постараюсь сейчас разобраться...
код длинный - может где и напутал...
постараюсь поэкспериментировать на маленьком примере, который написан в этой теме
Добавлено через 3 минуты
спасибо большое...
27742
Вот, полностью рабочий. В родителе создается красный квадрат, в наследнике зеленый. В итоге получаем зеленый.
Для наглядности красный больше, чем зеленый. То есть, если бы все работало не так, он был бы либо над зеленым, либо под, но виден.
Nikolay00700
22.03.2012, 00:05
Спасибо большое...
я понял почему у меня ничего не отображалось...
я подразумевал, что init у ребенка будет только заменен частично... а он полностью меняет всё, что было в функции init родителя.
соответственно, addChild у ребенка не писал..
Но тут невольно возникает мысль, что проще выделить содержимое конструктора базового класса в отдельную функцию и вызвать её у каждого ребенка... как и предполагал ранее...
здесь ведь не придется и init переписывать у каждого ребенка... и super()...
просто у каждого ребенка вместо super() будет стоять вызов этой функции, описанной в родителе...
спасибо большое...
Смотрите пример (если нужно в методе вызывать ПОЛНОСТЬЮ и метод родителя):
override protected function init():void {
super.init();
// другой код
}
Но в этом случае метод init у супера сработает весь, частично его не вызывать (разбить на части-методы, а?).
Nikolay00700
22.03.2012, 00:20
Вот теперь всё работает...!!! Спасибо!!!
И можно даже super() в конструкторе ребенка не вызывать..
Я так понимаю, что при создании экземпляра класса ребенка. Вызывается конструктор базового, а далее конструктор ребенка...
Раньше я думал, что super() запускает конструктор базового класса...
Теперь вижу, что и без super() всё запускается....
Добавлено через 1 минуту
В базовом классе я вообще убрал создание экземпляра pict.
Он создается только в init у детей....
И можно даже super() в конструкторе ребенка не вызывать..
Он сам вставится компилятором.
Я так понимаю, что при создании экземпляра класса ребенка. Вызывается конструктор базового, а далее конструктор ребенка...
Поставьте трейсы, чтобы увидеть.
Проблема в том, что он работает только с теми экземплярами, которые создал в конструкторе базового класса. А мне нужно, чтобы всё то, что проделывается в конструкторе базового класса, проходило с переменными созданными в детях.
Скармливайте свою переменную суперконструктору в конструкторах классов наследников.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.