【发布时间】:2016-05-09 19:51:06
【问题描述】:
我的班级定义是:
TAnimal = class(TInterfacedObject)
public
constructor Create; overload;
constructor Create(param : string); overload;
end;
IAnimal = interface
procedure DoSomething;
end;
TDog = class(TAnimal, IAnimal)
public
procedure DoSomething;
end;
TCat = class(TAnimal, IAnimal)
public
procedure DoSomething;
end;
示例代码:
procedure TForm1.DogButtonPressed(Sender: TObject);
var
myDog : TDog;
I : Integer;
begin
myDog := TDog.Create('123');
I := Length(myQueue);
SetLength(myQueue, I+1);
myQueue[I] := TDog; //Probably not the way to do it...??
end;
procedure TForm1.CatButtonPressed(Sender: TObject);
var
myCat : TCat;
I : Integer;
begin
myCat := TCat.Create('123');
I := Length(myQueue);
SetLength(myQueue, I+1);
myQueue[I] := TCat; //Probably not the way to do it...??
end;
procedure TForm1.OnProcessQueueButtonPressed(Sender: TObject);
var
MyInterface : IAnimal; //Interface variable
I : Integer;
begin
for I := Low(myQueue) to High(myQueue) do
begin
MyInterface := myQueue[I].Create('123'); //Create instance of relevant class
MyInterface.DoSomething;
end;
end;
假设您有一个带有三个按钮的表单。一个“Dog”按钮、一个“Cat”按钮和一个“Process Queue”按钮。当您按下“Dog”按钮或“Cat”按钮时,相关类将添加到数组中以充当队列。然后当您按下“处理队列”按钮时,程序将遍历数组,创建相关类的对象,然后调用在该类中实现的接口方法。记住我上面的示例代码,如何实现?
显然,简单的方法是将类名作为字符串添加到字符串数组中,然后在OnProcessQueueButtonPressed 过程中使用if 语句,例如:
procedure TForm1.OnProcessQueueButtonPressed(Sender: TObject);
var
MyInterface : IAnimal; //Interface variable
I : Integer;
begin
for I := Low(myQueue) to High(myQueue) do
begin
if myQueue[I] = 'TDog' then
MyInterface := TDog.Create('123');
if myQueue[I] = 'TCat' then
MyInterface := TCat.Create('123');
MyInterface.DoSomething;
end;
end;
我试图避免这种情况,因为每次我添加一个新类时,我都必须记住为新类添加一个 if 块。
【问题讨论】:
-
@J... 添加了一个明确的问题陈述,而不是暗示一个。在这种情况下,我使用的是 Delphi Seattle。
标签: arrays delphi oop polymorphism delphi-10-seattle