Почему я не смогу преобразовать экземпляр класса в экземпляр подкласса класса в AS3? - PullRequest
0 голосов
/ 15 сентября 2011

Я использую библиотеку, в которой есть функция, которая возвращает экземпляр некоторого класса Engine.

Я хотел бы привязать некоторые интерфейсы к Engine, поэтому я подкласс его class InterfacedEngine extends Engine implements AwesomeInterface.

Но когда я меняю код, который использует классы, из этого:

var engine:Engine = generateEngine();

на этот:

var interfacedEngine:InterfacedEngine = generateEngine();

Это дает мне ошибку времени выполнения (elisionмой):

TypeError: Error #1034: Type Coercion failed: cannot convert ...::Engine@1bc2bf11 to ....InterfacedEngine.

А как насчет классов AS3, я неправильно понимаю?

Ответы [ 2 ]

2 голосов
/ 15 сентября 2011

Одним из решений этой проблемы является шаблон проектирования Proxy. Вы можете прочитать об этом здесь: http://www.oodesign.com/proxy-pattern.html

По сути, вы создаете заполнитель для другого класса. Это делается с помощью композиции, а не наследования.

diagram

InterfaceEngine должен принимать объект типа Engine в качестве параметра конструктора. AwesomeINterface определяет все необходимые вам методы Engine. InterfaceEngine просто передает вызов метода к соответствующим метам объекта Engine, на котором он держится.

1 голос
/ 15 сентября 2011

Если B является базовым классом, а D расширяет B, тогда A D является B, но не наоборот. Это означает, что ссылка типа B может относиться как к B, так и к D. Но ссылка типа D может относиться только к D, а не к B. InterfacedEngine может относиться только к InterfacedEngine, а не к ее основанию Engine. Но тип Engine может относиться как к Engine, так и к InterfacedEngine.

var eng1:Engine = new Engine(); // valid
var eng2:Engine = new InterfacedEngine(); // valid
var eng3:InterfacedEngine = new InterfacedEngine(); // valid
var eng4:InterfacedEngine = new Engine(); // not valid
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...