如何在Object Pascal中实现类似C++中的模板
有时候,我们需要C++的模版,具体的类型在后期才能确定。
比如下面一个例子:
在用于遍历的Iterator模式中,有一个迭代器基类,大体如下:
TwhhIteratorBase = class
public
procedure First; abstract; virtual;
procedure Next; abstract; virtual;
//是否遍历完毕
procedure IsDone; abstract; virtual;
//返回当前元素.由于这时基类,返回TObject类型。
function CurrentItem: TObject; abstract; virtual;
end;
然后再一个具体应用中,比如一个文档列表对象,其对应的迭代器是从这个迭代器基类继承过来,前面三个方法都比较容易直接覆盖(override);
TwhhDocListIterator = class
private
FiCurrent: Integer;
public
procedure First; override;
procedure Next; override;
//是否遍历完毕
procedure IsDone; override;
//如果是Override,则返回值必须为TObject,跟父类声明一致。
//当我多么希望是返回的类型是TDoc,格式如下
//function CurrentItem:TDoc
//我在使用这个迭代器的时候就不需要进行类型转换
//这在C++中,运用模版是可以达到的。
function CurrentItem: TObject; override;
end;
希望大家能够积极参与,如何能够实现类似模板的思路。
首先,谢谢各位的参与。
我突然有一个想法,是否把CurrentItem作为属性
然后在子类中重新定义这个属性的类型。如:
TwhhIteratorBase = class
public
//返回当前元素.由于这时基类,返回TObject类型。
property CurrentItem: TObject;
end;
TwhhDocListIterator = class
public
//可以在子类重新定义这个属性的类型
property CurrentItem: TDoc read GetCurrentItem;
end;
这样的话,不管那个层次的迭代器,都这个属性CurrentItem。但在子类中
这个属性的类型可以不同。
那不一样,这个基类已经定义访问这个类的接口。我可以在其他地方中使用这个迭代器时,就可以直接使用这个接口了。无需知道这个接口是如何具体实现了。比如就这个迭代器,经常有对应的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覆盖后期达到。