关于刘艺《面向..》中关于接口的疑问? ( 积分: 20 )

  • 主题发起人 主题发起人 dongnan99
  • 开始时间 开始时间
D

dongnan99

Unregistered / Unconfirmed
GUEST, unregistred user!
我的问题是当一个类实现多个接口时,接口中有同名方法。是否必须在实现类中为同名方法指定别名,然后再实现???可下面的代码中TAmericanChinese 类实现ISpeakChinese, ISpeakEnglish接口却没有为其中的同名方法指定别名,只写了一个SayHello,这是什么意思??另外就是,下面的接口都没有guid,只不过继承了IInterface接口,是否这样写就可以不要guid,这样写有什么好处? 谢谢



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
function SayHello: string;
end;

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

TAmericanChinese = class (TMan, ISpeakChinese, ISpeakEnglish)
public
constructor create;
function SayHello: string;
end;

implementation

{
********************************** TAmerican ***********************************
}
function TAmerican.SayHello: string;
begin
result:='Hello!';
end;
{
*********************************** TChinese ***********************************
}
function TChinese.SayHello: string;
begin
result:='你好!';
end;

{
******************************* TAmericanChinese *******************************
}
constructor TAmericanChinese.create;
begin
name:='Tom Wang';
end;

function TAmericanChinese.SayHello: string;
var
Dad: ISpeakChinese;
Mum: ISpeakEnglish;
begin
Dad:=TChinese.Create;
Mum:=TAmerican.Create;
result:=Dad.SayHello+Mum.SayHello;
end;

end.
 
我的问题是当一个类实现多个接口时,接口中有同名方法。是否必须在实现类中为同名方法指定别名,然后再实现???可下面的代码中TAmericanChinese 类实现ISpeakChinese, ISpeakEnglish接口却没有为其中的同名方法指定别名,只写了一个SayHello,这是什么意思??另外就是,下面的接口都没有guid,只不过继承了IInterface接口,是否这样写就可以不要guid,这样写有什么好处? 谢谢



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
function SayHello: string;
end;

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

TAmericanChinese = class (TMan, ISpeakChinese, ISpeakEnglish)
public
constructor create;
function SayHello: string;
end;

implementation

{
********************************** TAmerican ***********************************
}
function TAmerican.SayHello: string;
begin
result:='Hello!';
end;
{
*********************************** TChinese ***********************************
}
function TChinese.SayHello: string;
begin
result:='你好!';
end;

{
******************************* TAmericanChinese *******************************
}
constructor TAmericanChinese.create;
begin
name:='Tom Wang';
end;

function TAmericanChinese.SayHello: string;
var
Dad: ISpeakChinese;
Mum: ISpeakEnglish;
begin
Dad:=TChinese.Create;
Mum:=TAmerican.Create;
result:=Dad.SayHello+Mum.SayHello;
end;

end.
 
说起这个接口还真的是不太清楚了。不过你说的同一个类中的同名方法的问题是不用提供别名什么的,编译程序可以根据方法的形参表来区分两个或多个重名的方法的,也就是面向对象程序设计中的多态性。你可以看看相关的书籍,这是面向对象程序设计的基本概念。
 
1。GUID可选,如果要实现具有COM特性的接口的话则需要加上,Delphi中对于有GUID的接口在运行时在VMT表的预定位置生成接口的信息,如接口方法的定义、方法参数定义能详细信息。
2。TAmericanChinese实现了2个接口,有一个SayHello方法,可以说2种语言,所以执行结果是:‘你好!hello!’,2种语言都同时用到了。
他在类里面的实现方法是:
function TAmericanChinese.SayHello: string;
var
Dad: ISpeakChinese;
Mum: ISpeakEnglish;
begin
Dad:=TChinese.Create;
Mum:=TAmerican.Create;
result:=Dad.SayHello+Mum.SayHello;
end;

用的是2个不同的接口,只是都有sayhello方法而已。没有你说得同名方法问题。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
583
import
I
后退
顶部