06.Delphi接口的不对等的多重继承
阅读原文时间:2023年07月15日阅读:1

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.