我们有一个基类Element,它有许多超类,比如ElementPicture。我们将元素列表存储在LinkedList类中。LinkedList类将所有元素存储在一个LinkedListNode类中,该类有成员next, prev, value, &列表。
然而,我们发现我们希望Element类本身知道prev, next, &父元素(每个元素都可以有一个主体,它是一个元素对象列表)。所以很自然的答案是LinkedList保存一个Element对象的列表,这些对象有next, prev, &成员列表。value成员消失了,因为节点就是值。
是否有一种干净的方式来编写一个库类,以某种方式应用于元素类给它LinkedListNode成员?泛型可以为内部声明传递类型,但不能进行扩展。即使他们可以,我们现在有WrObject -> Element -> ElementPicture,没有多重继承,没有办法注入LinkedListNode到其中。
另一个想法是创建一个ILinkedListNode接口,Element实现了它,并且它工作了。但是我们必须复制这些方法&成员数据声明跨到它,这是不干净的。
有什么建议吗?我们使用的是Typescript 1.5。
thanks - dave
相关阅读: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;
}
}
这有几个优点:
- 类甚至不可能意外地提供一些LinkedList方法的非标准实现
- 任何给定类实例的内存占用更小
- 类成员之间没有命名冲突的危险,你可能想在未来添加新的链表功能
- 当你在做一个列表操作和一个类操作时,它会更清晰
真正的嗅觉测试是findNext
(和其他抽象列表操作)不需要引用this
。如果你不用this
,为什么要用class
呢?FxCop会警告你c#类中没有使用this
的非静态方法。