{链表节点类}
  TNode<E> = class(TObject)
  private
    FElement : E;           //当前节点中的元素
    FNext : TNode<E>;       //当前节点的下一个节点
    FPrevious : TNode<E>;    //当前节点的上一个节点
  published
    property Element : E read FElement write FElement;
    property Next : TNode<E> read FNext write FNext;
    property Previous : TNode<E> read FPrevious write FPrevious;
  public
    constructor Create; overload;
    constructor Create(Next : TNode<E>;Previous : TNode<E>);overload;
    constructor Create(element : E;Next : TNode<E>;Previous : TNode<E>);overload;
    destructor Destroy; override;      
  end;我想写一个双向链表,这是节点类。{ TNode<E> }constructor TNode<E>.Create;
begin
  inherited;
  // 这里怎么写? FElement := ??
  FNext := nil;
  FPrevious := nil;
end;constructor TNode<E>.Create(element: E; Next, Previous: TNode<E>);
begin
  FElement := element;
  FNext := Next;
  FPrevious := Previous;
end;1.这两个重载方法,下面那个 TNode<E>.Create  这儿会有下划线红色显示,提示Overload procedure ‘’ must be ed with............但是编译无错也无警告的。
2.还有,第一个Create方法里FElement那里要怎么写呢?null和nil有什么区别呢?我知道java中这样都赋为null就可以,delphi请教
private class Node<E>{
E element;
Node<E> next;
Node<E> previous;
public Node(E element, Node<E> next, Node<E> previous) {
super();
this.element = element;
this.next = next;
this.previous = previous;
}
}

解决方案 »

  1.   

    试试
    type
      TNode<E:class> = class  // 把 E 类型化
      strict private // 题外话:最好加上关键字strict,strict可将私有成员类似c++友元特性无效,
                     // delphi中同个单元内的各个类的private成员实际都是友元的存在
      ....constructor TNode<E>.Create;
    begin
      FElement := nil;  // 就可以赋值nil
      FNext := nil;
      FPrevious := nil;
    end;
     
    你最好直接到generics.collections单元里找一个合适的链表类继承就好了,例如TStack<T>就是一种泛型双向链表。delphi的都有源码,看看generics.collections单元里的那些泛型容器都是怎么写的就好了。
    俺都好久没有用d2009以上的版本了,泛型也不是必须的东西,没啥机会弄大工程,也就没法体会泛型对工作效率提高的好处,俺也就用得少都不太熟悉了。另外delphi中俺只知道variants 单元里有个 Null函数,Null函数返回一个null的variant,
    关键字的null就不清楚了,貌似在d6开始null关键字就被废弃了。