Почему не работает иерархия классов actionscript3.0 (иногда)? - PullRequest
6 голосов
/ 18 февраля 2009

Все объекты в actionscript3.0 наследуются от класса Object, но компилятор actionscript3.0, похоже, недостаточно умен, чтобы это понять.

взгляните на следующий код:

package{
   public class TestOne{
      public function TestOne(){
        var t2: TestTwo = new TestTwo();
        trace(t2.toString()); // COMPILE TIME ERROR
        trace((t2 as Object).toString(); // [object TestTwo]

        var t22 : * = new TestTwo();
        trace(t22.toString()); // [object TestTwo]
        trace((t22 as Object).toString(); // [object TestTwo]
      }
   }
}
class TestTwo{}

t2.toString () выдает ошибку времени компиляции, поскольку тип данных t2 не включает toString () . Однако t2 действительно включает toString () , потому что это объект, как (t2 как Object) .toString () . Если мы не дадим переменной тип данных, такой как t22, то проблема никогда не возникнет. Почему компилятор actionscript3.0 не может сделать так, чтобы t2 был одновременно TestTwo и Object?

Ответы [ 2 ]

4 голосов
/ 18 февраля 2009

Это потому что

Методы класса Object динамически создается на объекте прототип. Чтобы переопределить этот метод в подкласс объекта, не используйте переопределить ключевое слово. Например, подкласс объекта реализует функцию toString (): String вместо использования переопределение базового класса.

Таким образом, если вы приведете TestTwo к объекту, компилятор знает, что эти методы будут реализованы. Если вы не приведете его, TestTwo не наследует эти методы, поэтому они не были реализованы и приведут к ошибке.

Это немного странно!

0 голосов
/ 19 февраля 2009

Наследование классов и Наследование прототипов - это две разные вещи в AS3. Насколько я понимаю, наследование прототипа включено для обратной совместимости с AS2 / AS1, а это наследование прототипа, обеспечивающее метод toString() для переменной, приведенной к классу Object в вашем примере. Прототип Object имеет метод toString(), а не Object class . Поскольку прототип отсутствует в вашем классе TestTwo, у него нет метода toString(). Если бы метод toString() был передан через наследование классов, ваш пример скомпилировался бы.

Таким образом, технически ваше утверждение «Все объекты в actionscript3.0 наследуются от класса Object» не совсем корректно из-за различий между наследованием прототипа и наследованием класса. Наследование прототипа - это несколько эзотерическая концепция ОО, встречающаяся в языках сценариев.

Кто-нибудь знает причину, по которой AS3 имеет такую ​​конструкцию?

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