循环依赖工厂模式

时间:2017-10-26 15:14:13

标签: typescript

让我们有以下模式:

const mapping:Map<string,Type<A>>=new Map<string,Type<A>>([
  ["b",B],
  ["c",C]
])

abstract class A{
   var childrenTypes:string[];
   var children:A[];
   public setupChildren():void{
     this.children=this.childrenTypes.map(t=>mapping.get(t).new());
   }
}

class B extends A{}

class C extends A{}

这导致循环依赖。将setupChildren方法作为另一个类中的静态方法移动不会破坏循环依赖。

LATER EDIT:该解决方案适用于扩展A的任意数量的类,放在不同的文件中。

1 个答案:

答案 0 :(得分:0)

mapping声明移到最后?

abstract class A{
   childrenTypes: string[]; // not var
   children: A[]; // not var
   public setupChildren():void{
     // there's no method named "new".
     // you need ! to ignore the possibly-undefined return value of get(),
     // or you need to do a check for the get() result
     this.children=this.childrenTypes.map(t=> new (mapping.get(t)!));
   }
}

class B extends A{}

class C extends A{ }

// set mapping here    
let mapping: Map<string, Type<A>> = new Map<string, Type<A>>([
  ["b",B],
  ["c",C]
])

现在它在没有任何东西被使用之前进行编译。 mapping定义中对setupChildren()的引用不是问题,因为它在设置mapping的值之前永远不会运行。

希望有所帮助。