我正在编写一些针对两个非常相似的硬件版本的软件,直到我使用API来初始化硬件,我才知道我会找回哪种类型.
因为硬件非常相似,我计划有一个父类(TParent),它有一些抽象方法(对于硬件不同的地方),然后是两个子类(TChildA,TChildB),它们以硬件相关的方式实现这些方法.
所以我首先实例化一个TParent的对象检查它是什么样的,然后把它投射到正确的孩子.
但是,当我这样做并调用在子类中完全实现的抽象方法之一时,我得到一个EAbstractError.
例如:
myHardware:=TParent.Create(); if myHardware.TypeA then myHardware:=TChildA(myHardware) else myHardware:=TChildB(myHardware); myHardware.SomeMehtod();
我假设我不能将父类强制转换为子类,并且还有一种更好的方法可以做到这一点.有什么指针吗?
您需要一个工厂方法来根据您使用的硬件类型返回正确的类...
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;
...或者你可以使用状态模式.
两种方法中的共同点是您的TParent类不具备确定硬件类型的知识.知识转移到工厂方法,工厂方法的调用者,工厂本身或状态类.