我们有一个基类Element,它有许多超类,比如ElementPicture。我们将Elements列表存储在LinkedList类中。 LinkedList类将所有元素存储在LinkedListNode类中,该类具有成员next,prev,value和&名单。这一切都按预期工作。
然而,我们发现我们希望Element类本身知道prev,next和& parent元素(每个Element可以有一个Body对象列表的主体)。因此,自然的答案是LinkedList保存一个Element对象列表,这些对象具有next,prev,&列出成员。值成员消失,因为节点是值。
是否有一种编写库类的简洁方法,以某种方式应用于Element类,为其提供LinkedListNode成员?泛型可以为内部声明传递一种类型,但它们不能进行扩展。即使他们可以,我们现在有WrObject - >元素 - > ElementPicture没有多重继承,就无法将LinkedListNode注入其中。
另一个想法是创建一个ILinkedListNode接口,Element实现了它,并且可行。但是我们必须复制这些方法&成员数据声明到它并且不干净。
有什么建议吗?我们正在使用Typescript 1.5。
谢谢 - 戴夫
答案 0 :(得分:0)
相关阅读:https://en.wikipedia.org/wiki/BaseBean
您的课程唯一需要的是prev
和next
。所有LinkedList
特定的事物都可以分解为一个为LinkedList
个对象提供功能的模块:
interface LinkedList<T> {
prev: LinkedList<T>;
next: LinkedList<T>;
}
class MyElement implements LinkedList<MyElement> {
prev: MyElement;
next: MyElement;
name = 'bob';
findThing() {
return LinkedList.findNext(this, n => n.name === 'joe').name;
}
}
module LinkedList {
export function findNext<T extends LinkedList<{}>>(start: T, predicate: (x: T) => boolean): T {
let current: T = start;
while(current && !predicate(current)) {
current = <T>current.next;
}
return current;
}
}
这有几个好处:
这里的真实气味测试是findNext
(和其他抽象列表操作)不需要引用this
。如果您没有使用this
,为什么要使用class
?由于同样的原因,FxCop会警告你在C#类中没有使用this
的非静态方法。