Ну не дурдом, вполне штатная ситуация: DisplayObject - родительский класс по отношению к DisplayObjectContainer, но у него есть свойство типа DisplayObjectContainer (parent).
AS3 такое тоже позволяет, т.е. заявлять о зависимостки к наследникам. Хорошо это или нет? - я не знаю, это может усложнить ситуацию, но в целом, я не вижу ничего плохого в этом.
Но я так понял, что проблема скорее в том что:
Код AS3:
class A {
public function A() { new B(); }
}
class B extends A {
public function B() { super(); }
}
Я специально подчеркнул super(), чтобы нагляднее выло видно где происходит рекурсивный вызов, без условия.
Соответственно, варианты решения:
- вообще убрать создание чего бы то ни было из конструктора (это по ряду причин редко когда чем-то хорошим заканчивается), перенесите содержание конструктора в другую функцию. Если хочется полсе этого можно еще добавить статический метод, который обернет конструктор и функцию-иницализатор, например, так:
Код AS3:
calss A {
public function A() {}
public function initialize():void { new B(); }
public static function makeA():A {
var a:A = new A();
a.initialize();
return a;
}
}
Если, по каким-то причинам, решение не устраивает, можно отталкиваться от, например, параметров к конструктору, или через отражение выяснить в каком именно классе выполняется код, и отреагировать соответственно. Например:
Код AS3:
class A {
public function A() {
if (this.constructor == A) new B();
}
}
Но для каких-то других случаев можно придумать другие решения. Например, лениво создавать B, т.е. только тогда, когда он понадобиться, и таким образом можно реализовать условно бесконечную цепочку. Например:
Код AS3:
class A {
private var _b:B;
public function get b():B {
if (!_b) this._b = new B();
return this._b;
}
public function A() {}
}