如何将LinkedList功能添加到类

时间:2015-08-06 21:58:37

标签: linked-list typescript typescript1.5

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

谢谢 - 戴夫

1 个答案:

答案 0 :(得分:0)

相关阅读: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的非静态方法。

相关问题