如何在delphi中实现多重继承?

Lep*_*eus 14 delphi multiple-inheritance

我正在完全重写一个旧库,我不知道如何处理这种情况(为了理解,所有人都欢呼自行车比喻):

我有以下课程:

  • TBike - 自行车本身
  • TBikeWheel - 自行车的一个轮子
  • TBikeWheelFront并且TBikeWheelBack,它们都从它继承TBikeWheel并实现了它们所需的特定内容

这非常简单,但现在我决定制造多种自行车,每辆自行车都有自己的轮子 - 它们和普通的前轮/后轮一样,加上特定的自行车.

  • TBikeXYZ - 继承自 TBike
  • TBikeWheelXYZ - 继承自 TBikeWheel

这是我的问题:TBikeWheelFrontXYZ应该继承TBikeWheelXYZ(以获得XYZ轮的特定方法),但它也应该继承TBikeWheelFront(以获得前轮的特定方法).

我的问题是,如何以不这样的方式实现它:

  1. 感觉就像一个黑客
  2. 强迫我多次重写相同的代码

Tim*_*vis 17

Delphi不支持多重继承.但是类可以支持/实现多个接口,并且您可以委派接口实现,因此您可以模拟多个继承.


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++)库中的相应类所做的操作,并在相应的类的构造函数中实例化它们.


Bri*_*ost 6

使用多态来将每个"事物"作为一个对象层次结构实现,然后依次向该对象添加对象属性.因此,创建一个轮子层次结构和一个自行车层次结构.然后将轮子添加到自行车作为祖先自行车对象中的字段.见下文.

  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)


Uwe*_*abe 5

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)