06.Delphi接口的不对等的多重继承

uSayHello代码如下

unit uSayHello;

interface

uses
  SysUtils,
  Windows,
  Messages,
  Classes,
  Graphics,
  Controls,
  Forms,
  Dialogs;

type
  ISpeakChinese = interface(IInterface)
    function SayHello: string;
  end;

  ISpeakEnglish = interface(IInterface)
    function SayHello: string;
  end;

  TMan = class(TInterfacedObject)
  private
    FName: string;
  public
    property Name: string read FName write FName;
  end;

  TChinese = class(TMan, ISpeakChinese)
  private
    FSkinColor: string;
    function SayHello: string;
  public
    constructor create;
    property SkinColor: string read FSkinColor write FSkinColor;
  end;

  TAmerican = class(TMan, ISpeakEnglish)
  private
    function SayHello: string;
  end;

  TAmericanChinese = class(TChinese, ISpeakEnglish)
  public
    constructor create;
    function TomSayHello: string;
  end;

implementation

function TAmerican.SayHello: string;
begin
  result := 'Hello!';
end;

constructor TChinese.create;
begin
  SkinColor := '黄色';
end;

function TChinese.SayHello: string;
begin
  result := '你好!';
end;

constructor TAmericanChinese.create;
begin
  name := 'Tom Wang';
  Inherited;
end;

function TAmericanChinese.TomSayHello: string;
var
  // Dad: ISpeakChinese;
  Mum: ISpeakEnglish;
begin
  // Dad:=TChinese.Create;
  // 只有子类TAmerican才具体实现了SayHello的方法
  Mum := TAmerican.create;
  // SayHello是继承的中国人的Hello方法
  result := SayHello + Mum.SayHello;
end;

end.

调用单元如下

unit frmMain;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    LabeledEdit1: TLabeledEdit;
    LabeledEdit2: TLabeledEdit;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

uses uSayHello;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  Tom:TAmericanChinese;
begin
   Tom:=TAmericanChinese.Create;
  try
    LabeledEdit1.text:=Tom.Name;
    LabeledEdit2.text:=Tom.SkinColor;
    Showmessage(Tom.Tomsayhello);
  finally
    Tom.Free;
  end;
end;

end.

 

posted @ 2019-09-07 18:42  像一棵海草海草海草  阅读(184)  评论(0编辑  收藏  举报