Rob*_*obS 4 delphi oop freepascal
我正在编写一些针对两个非常相似的硬件版本的软件,直到我使用API来初始化硬件,我才知道我会找回哪种类型.
因为硬件非常相似,我计划有一个父类(TParent),它有一些抽象方法(对于硬件不同的地方),然后是两个子类(TChildA,TChildB),它们以硬件相关的方式实现这些方法.
所以我首先实例化一个TParent的对象检查它是什么样的,然后把它投射到正确的孩子.
但是,当我这样做并调用在子类中完全实现的抽象方法之一时,我得到一个EAbstractError.
例如:
myHardware:=TParent.Create();
if myHardware.TypeA then
myHardware:=TChildA(myHardware)
else
myHardware:=TChildB(myHardware);
myHardware.SomeMehtod();
Run Code Online (Sandbox Code Playgroud)
我假设我不能将父类强制转换为子类,并且还有一种更好的方法可以做到这一点.有什么指针吗?
您需要一个工厂方法来根据您使用的硬件类型返回正确的类...
function CreateHardware(isTypeA: Boolean): TParent;
begin
if IsTypeA then Result := TChildA.Create
else Result := TChildB.Create;
end;
...
var
myHardware: TParent;
begin
myHardware := CreateHardware(True);
myHardwarde.SomeMethod;
end;
Run Code Online (Sandbox Code Playgroud)
...或者你可以使用状态模式.
两种方法中的共同点是您的TParent类不具备确定硬件类型的知识.知识转移到工厂方法,工厂方法的调用者,工厂本身或状态类.
| 归档时间: |
|
| 查看次数: |
3580 次 |
| 最近记录: |