Я пытаюсь решить проблему проектирования, используя полиморфизм на основе наследования и динамическое связывание. У меня есть абстрактный суперкласс и два подкласса. Суперкласс содержит общее поведение. SubClassA и SubClassB определяют несколько разных методов:
SubClassA определяет метод executeTransform (), а SubClassB - нет.
Итак, следующий пример
1 var v:SuperClass;
2 var b:SubClassB = new SubClassB();
3 v = b;
4 v.performTransform();
вызовет ошибку компиляции в строке 4, так как executeTransform () не определен в суперклассе. Мы можем заставить его скомпилировать, приведя ...
(v as SubClassA).performTransform();
однако, это вызовет исключение времени выполнения, так как v на самом деле является экземпляром SubClassB, который также не определяет executeTransform ()
Таким образом, мы можем обойти это, проверив тип объекта перед его приведением:
if( typeof v == SubClassA)
{
(cast v to SubClassA).performTransform();
}
Это обеспечит, что мы будем вызывать executeTransform () только для v, которые являются экземплярами SubClassA. Это довольно нелегкое решение для моих глаз, но по крайней мере это безопасно. Я использовал интерфейс на основе полиморфизма (значение интерфейса
тип, который не может
быть созданным и определяющим API классов, которые его реализуют) в прошлом, но это также кажется неуклюжим. Для приведенного выше случая, если SubClassA и SubClassB реализовали ISuperClass
который определил executeTransform, тогда они оба должны будут выполнить executeTransform (). Если у SubClassB нет реальной необходимости в executeTransform (), вам придется реализовать пустую функцию.
Там должен быть шаблон проектирования, который решает проблему.