Sorry.由于匆忙,前面的InDone方法的声明更改为如下:
   function IsDone: Boolean;

解决方案 »

  1.   

    多谢artman的参与。
    Variant是一个变体,可以保存任何值。但是我需要的是能够在子类中
    返回所需要类型的对象。Variant和对象之间是不能直接转换的啊。
      

  2.   

    Object pascal中没有模板,你可以把参数设置为TObject(或其它基类),运行时用RTTI去检验类型.
      

  3.   

    首先,谢谢各位的参与。
    我突然有一个想法,是否把CurrentItem作为属性
     然后在子类中重新定义这个属性的类型。如:
         TwhhIteratorBase = class
         public
           //返回当前元素.由于这时基类,返回TObject类型。
           property CurrentItem: TObject; 
         end;     TwhhDocListIterator = class
         public
           //可以在子类重新定义这个属性的类型
           property CurrentItem: TDoc read GetCurrentItem;  
         end;
    这样的话,不管那个层次的迭代器,都这个属性CurrentItem。但在子类中
    这个属性的类型可以不同。
      

  4.   

    那不一样,这个基类已经定义访问这个类的接口。我可以在其他地方中使用这个迭代器时,就可以直接使用这个接口了。无需知道这个接口是如何具体实现了。比如就这个迭代器,经常有对应的Traverser类。Traverser类中有一个迭代器的实例,就可以直接使用这个迭代器了,无需知道这个迭代器是如何实现。代码如下:
      TTraverser = class
      protected
        function ProcessItem(AobjItem: TObject): Boolean;
        function CreateIterator: TwhhIterator;
      public
        function Traverser: Boolean;
      end;下面是实现代码:
    function TTraverser.CreateIterator: TwhhIterator;
    begin
      Result := TwhhIterator.Create;
    end;function TTraverser.ProcessItem(AobjItem: TObject): Boolean;
    begin
      Result := True;
    end;function TTraverser.Traverser: Boolean;
    var
      objIterator: TifoIterator;
    begin
      Result := False;
      objIterator := CreateIterator;
      //通过Iterator遍历,然后对所有Item进行ProcessItem操作。
      objIterator.First;
      while not objIterator.IsDone do begin
        if not ProcessItem(objItem.CurrentItem) then begin
          Exit;
        end;
        objIterator.Next;
      end;
      Result := True;
    end;
    这个Traverser类就是通过迭代器的遍历,对Item进行ProcessItem操作。完成对所有Item的操作。而且这个类很容易进行子类化,从而实现对Item进行不同操作的目的,重用性高。但在Traverser类不一定需要Iterator类具体是如何实现,就可以完成了。而且是什么Iterator子类实例化,可以在子类对CreateIterator覆盖后期达到。
      

  5.   

    你是对的,使用OO设计模式的一些技巧可以代替C++模板的部分功能.这样在子类中就不必重写大部分的有关算法的代码.
    在这个例子里,要为每个子类写GetCurrentItem的代码,当然.
    要是想同使用C++模板那么简单是不可能的.