我正在编写一些针对两个版本非常相似的硬件的软件,在我使用 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 正在生锈)

希望这些杂谈有所帮助。

10-08 05:42
查看更多