如何将LinkedList功能添加到类中



我们有一个基类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

你的类只需要一个prevnext。所有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的非静态方法。

相关内容

  • 没有找到相关文章