unit uSayHello; interface uses SysUtils, Windows, Messages, Greaphics, Controls, Forms, Dialogs; type ISeakChinese = interface(IInterface) function SayHello: string; end; ISpeakEndlish = 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 PSkinColor: string; function SayHello: string; public constructor create; property SkinColor: TType read FSkinColor write FSkinColor; end; TAmerican = class(TMan,ISpeakEndlish) function SayHello: string; end; TAmericanChinese = class(TChinese,ISpeakChinese,ISpeakEndlish) public constructor create; function SayHello: string; end; implementation function TAmerican.SayHello: string; begin result := 'Hello!'; end; function TChinese.SayHello: string; begin result := '你好'; end; function TAmericanChinese.create; begin name := 'Tom Wang'; end; function TChinese.create; begin skincolor := 'yellow'; end; function TAmericanChinese : string; var Dad:ISpeakChinese; Mum:ISpeakEndlish; begin Dad := TChinese.create; Mum := TAmerican.create; result := Dad.SayHello + Mum.SayHello; end; end. unit FormMain; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Fomrs, Dialogs, StdCtrls, Extctrls; type TForm1 = class(TForm) Button1: TButton; LabeledEdit1: TLabeledEdit; LabeledEdit2: TLabeledEdit; procedure ButtonClick(Sender: TObjct); private //... public //... end; var From1: TForm1; implementation uses uSayHello; procedure TForm1.Button1Click(Sender: TObjct) var Tom: TAmericanChinese; begin Tom := TAmerican.create; try LabeledEdit1.text := Tom.Name; LabeledEdit2.text := Tom.SkinColor; Showmessage(Tom.SayHello); finally Tom.Free; end; end;
下面来比较一下这两种的写法:
TAmericanChinese = class(TChinese,ISpeakChinese,ISpeakEndlish) //A TAmericanChinese = class(TChinese,ISpeakEndlish) //B
其实A可以写成B这种形式,功能也是可以实现的.
那么,这两种写法是一个意思吗?不是的!
对于A形式:强调的是几口继承
对于B形式:侧重的是类继承
B形式如下图: