Что делает виртуальное ключевое слово в actionscript? - PullRequest
9 голосов
/ 12 февраля 2010

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

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 то, что мне не хватает?

Ответы [ 2 ]

17 голосов
/ 12 февраля 2010

Из справочных документов (если вы используете 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 виртуальное абсолютно ничего не делает.

1 голос
/ 12 февраля 2010

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...