我正在编写一些针对两个版本非常相似的硬件的软件,在我使用 API 初始化硬件之前,我无法知道我将返回哪种类型。
因为硬件非常相似,我计划有一个父类(TParent),它有一些抽象方法(硬件不同的地方),然后有两个子类(TChildA,TChildB),它们以硬件相关的方式实现这些方法。
所以我会首先实例化一个 TParent 的对象,检查它是什么类型,然后将它转换到正确的 child 。
但是,当我这样做并调用在子类中完全实现的抽象方法之一时,我得到了一个 EAbstractError。
例如:
myHardware:=TParent.Create();
if myHardware.TypeA then
myHardware:=TChildA(myHardware)
else
myHardware:=TChildB(myHardware);
myHardware.SomeMehtod();
我假设我不能将父类转换为子类,而且可能有更好的方法来做到这一点。任何指针?
最佳答案
你是对的,你不能也不应该从基类转换到派生类。
我假设您不想让 Child 对象重新运行 Parent 构造函数?
如果是这样的话 。 . .
删除现有的父/子关系,您将只有一个硬件类。
对于特定的 ChildA 和 ChildB 功能,创建一个新的继承模式,以便您拥有一个 ISpecificHardwareTasks 接口(interface)或基类,以及两个派生类(SpecificA 和 SpecificB)。
当硬件构建它自己时,它知道它正在使用什么类型的硬件,然后它会创建一个SpecificA或SpecificB的实例)。此实例是硬件私有(private)的。
硬件公开包装 ISpecificHardWareTasks 方法的方法(如果有意义,它甚至可以实现该接口(interface))。
如果有必要,特定类可以引用硬件类(尽管我不知道您是否可以访问构造函数中的 this 指针,但我的 Delphi 正在生锈)
希望这些杂谈有所帮助。