2010-02-12 4 views
9

Я нашел некоторый код, который использует virtual ключевое слово для функций, как:Что делает виртуальное ключевое слово в ActionScript?

package tryOut{ 
    public class Parent { 

     public function Parent() {} 

     public function foo():void{ 
      trace("Parent foo"); 
     }//foo 

     public virtual function bar():void{ 
      trace("Parent virtual bar"); 
     }//bar  
    }//class 
}//package 

Насколько я понимаю, используя virtual ключевое слово должно изменить способ переопределения метода работы, или путь, используя метод ребенок работать или что-то в этом роде. Но, похоже, ничего не делает. Имея РАСШИРЕНИЯ:

package tryOut { 
    public class Child extends Parent { 
     public function Child() {} 

     public override function foo():void { 
      trace("Child foo"); 
     }//foo 

     public override function bar():void { 
      trace("Child virtual bar"); 
     }//bar 

    }//class 
}//package 

Следующий код печатает:

var parent:Parent = new Parent(); 
var child:Child = new Child(); 

parent.foo(); //Parent foo 
child.foo(); //Child foo 
parent.bar(); //Parent virtual bar 
child.bar(); //Child virtual bar 

var childCast:Parent = child as Parent; 

parent.foo(); //Parent foo 
childCast.foo(); //Child foo 
parent.bar(); //Parent virtual bar 
childCast.bar(); //Child virtual bar 

Так оба метода работают одинаково в отношении переопределения. Изменяет ли ключевое слово virtual что-то, что мне не хватает?

ответ

17

Из справочных документов (Если вы используете Flash, сделайте поиск «виртуальный»):

Есть также несколько идентификаторов , которые иногда называют будущие зарезервированные слова. Эти идентификаторы не зарезервированы ActionScript 3.0, хотя некоторые из них могут рассматриваться как ключевые слова по программному обеспечению , который включает ActionScript 3.0. Возможно, вы используете в своем коде многие из этих идентификаторов, но Adobe рекомендует вам не использовать их , так как они могут отображаться в качестве ключевых слов в следующей версии этого языка.

abstract boolean byte cast 

char debugger double enum 

export float goto intrinsic 

long prototype short synchronized 

throws to transient type 

virtual volatile 

Таким образом, в AS3, виртуальная абсолютно ничего не делает.

+3

И фактическая страница для всех, кого это интересует: http://help.adobe.com/en_US/ActionScript/3.0_ProgrammingAS3_Flex/WS5b3ccc516d4fbf351e63e3d118a9b90204-7f9b.html – LopSae

+0

Спасибо LopSae, на самом деле у меня на самом деле была открытая Flash в то время, поэтому Я использовал автономную справку. – Ponkadoodle

1

Таким образом, оба метода работают одинаково в отношении переопределения.

Что вы думаете об этом? Те тесты, которые вы показали, не сопоставимы.

childCast напечатан как Parent, но вы все еще в конечном итоге вызываете функцию в Child.

Вы не проверяете ту же ситуацию для не виртуального метода.

+0

Плохо, я исправил пример. Тем не менее, поведение остается неизменным. – LopSae

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