Я думаю, что это должно быть очевидно, но по какой-то причине это не имеет смысла для меня.Изменение состояния объекта в переопределенной функции не отражается в функции базового класса
public class Foo extends Sprite
{
protected var dict:Dictionary = new Dictionary();
protected function subclassBehavior():void
{
//defined in subclass
}
public function accessDictionary():void
{
subclassBehavior();
var i:int = 0;
for each(var value:Object in dict)
{
i++;
}
trace(i);
}
}
Простой достаточно.
Тогда подкласс:
public class Bar extends Foo
{
override protected function subclassBehavior():void
{
dict["a"] = "b";
}
}
И потом, если я:
var instance:Foo = new Bar();
instance.accessDictionary();
Я бы ожидать, что след, чтобы вернуться 1. Вместо этого он возвращает 0. Запись в Словаре просто Безразлично существуют какие-либо методы в Foo. Если у меня есть другая функция в баре, которая смотрит на dict, она увидит запись. Я попытался создать экземпляр словаря в Bar и передать его Foo, изменив вызов в Bar, чтобы вызвать метод в Foo, который обновляет словарь, и т. Д., Ничто из этого не меняет мою ситуацию.
Нужно ли переопределять любые функциональные возможности базового класса, которые я хочу отразить другим переопределенным поведением в подклассе?
Я проверил ваш код, и он напечатал 1 для меня. –
Что происходит, когда вы ставите точку останова в 'subcassBehavior()' и смотрите на значение 'dict'? –
barış ваш результат 1, но, может быть, ваши версии компилятора в любом случае разные. Мне кажется, вы должны вызвать super() в конструкторе Bar и создать экземпляр словаря в конструкторе Foo (компилятор делает это автоматически, но я не уверен, что это ваша версия компилятора) –