2013-04-02 1 views
0

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

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, который обновляет словарь, и т. Д., Ничто из этого не меняет мою ситуацию.

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

+0

Я проверил ваш код, и он напечатал 1 для меня. –

+0

Что происходит, когда вы ставите точку останова в 'subcassBehavior()' и смотрите на значение 'dict'? –

+0

barış ваш результат 1, но, может быть, ваши версии компилятора в любом случае разные. Мне кажется, вы должны вызвать super() в конструкторе Bar и создать экземпляр словаря в конструкторе Foo (компилятор делает это автоматически, но я не уверен, что это ваша версия компилятора) –

ответ

0

Я не уверен, что для каждого работает со словарем. вы можете попробовать

for(var key:String in dict) 
{ 
    i++; 
} 
+0

foreach прекрасно работает с –

Смежные вопросы