Lep*_*eus 14 delphi multiple-inheritance
我正在完全重写一个旧库,我不知道如何处理这种情况(为了理解,所有人都欢呼自行车比喻):
我有以下课程:
TBike - 自行车本身TBikeWheel - 自行车的一个轮子TBikeWheelFront并且TBikeWheelBack,它们都从它继承TBikeWheel并实现了它们所需的特定内容这非常简单,但现在我决定制造多种自行车,每辆自行车都有自己的轮子 - 它们和普通的前轮/后轮一样,加上特定的自行车.
TBikeXYZ - 继承自 TBikeTBikeWheelXYZ - 继承自 TBikeWheel这是我的问题:TBikeWheelFrontXYZ应该继承TBikeWheelXYZ(以获得XYZ轮的特定方法),但它也应该继承TBikeWheelFront(以获得前轮的特定方法).
我的问题是,如何以不这样的方式实现它:
Nic*_*ges 16
使用接口.像这样的东西(根据你的描述,我的头顶......)
type
IBikeWheel = interface
...
end;
IXYZ = interface
...
end;
IFrontWheel = interface(IBikeWheel)
...
end;
TBike = class
...
end;
TBikeWheel = class(TObject, IBikeWheel);
TBikeWheelXYZ = class(TBikeWheel, IXYZ);
TBikeFrontWheelXYZ = class(TBikeWheelXYZ, IFrontWheel);
Run Code Online (Sandbox Code Playgroud)
然后为接口执行类,这些接口执行旧的(可能是C/C++)库中的相应类所做的操作,并在相应的类的构造函数中实例化它们.
使用多态来将每个"事物"作为一个对象层次结构实现,然后依次向该对象添加对象属性.因此,创建一个轮子层次结构和一个自行车层次结构.然后将轮子添加到自行车作为祖先自行车对象中的字段.见下文.
TBikeWheel = class
TBikeWheelXYZ = class( TBikeWheel )
TBike = class
FFrontWheel : TBikeWheel;
property FrontWheel : TBikeWheel
read FrontWhell
TBikeABC = class( TBike)
constructor Create;
end;
constructor TBikeABC.Create;
begin
inherited;
FFrontWheel := TBikeWheel.Create;
end;
TBikeXYZ = class( TBike)
constructor Create;
end;
constructor TBikeXYZ.Create;
begin
inherited;
FFrontWheel := TBikeWheelXYZ.Create;
end;
Run Code Online (Sandbox Code Playgroud)
Brian Frost的建议的变体:
TBikeWheel = class
TBikeWheelXYZ = class( TBikeWheel )
TBike = class
FFrontWheel : TBikeWheel;
protected
function CreateWheel: TBikeWheel; virtual;
public
property FrontWheel : TBikeWheel
read FrontWheel
end;
TBikeABC = class( TBike)
protected
function CreateWheel: TBikeWheel; override;
end;
function TBikeABC.CreateWheel: TBikeWheel;
begin
result := TBikeWheel.Create;
end;
TBikeXYZ = class( TBike)
protected
function CreateWheel: TBikeWheel; override;
end;
function TBikeXYZ.CreateWheel: TBikeWheel;
begin
result := TBikeWheelXYZ.Create;
end;
Run Code Online (Sandbox Code Playgroud)