关于多态和OOP

唐力伟 2004-09-07 09:18:35
这样的情况:
TMan=Class;
TFrance=class(TMan);
TChina=Class(TMan);
TAmerica=Class(TMan);
-----------------------------------
TMan下有个虚方法Say在TMan的子类们中各自实现;
好比说:
aman:TMan;
aMan:=TChina.Create;
那么:aMan.Say就说了汉语;
aman:TMan;
aMan:=TFrance.Create;
那么:aMan.Say就说了法语;
........
利用编译器实现了多态;
这是刘艺老师书中的例子;
-------------------------------------
某种情况下我只能收到到AMan:TMan了,
好比我有个JapanChicken类,它由于某种隔阂只能从objectList里边收到基类为TMan的各种man
但是这些Man的classname实际是TChina,TFrance,TAmerica.....
JapanChicken有个playwith的方法,是需要从objectList里见了人才决定的,所以重载成下边这样:
procedure JapanChicken.playwith(cn:TChina);overload;
procedure JapanChicken.playwith(usa:TAmerica);overload;
procedure JapanChicken.playwith(fs:TFrance);overload;
如果简单的传入以TMan为类型的而实际为TMan的实现类的各种man,
比如说:JapanChicken.PlayWith(TMan(ObjectList.items[i]));
编译会通不过(说:no overloaded version...TMan...);
我不想如下再加一个函数通过if语句判断感觉那样失去了多态的意义:
procedure JapanChicken.play(AMan:TMan);
begin
if TMan.Classname='TChina' then PlayWith(TChina(AMan));
if TMan.ClassName='TFrance' then PlayWith(TFrance(AMan));
if TMan.ClassName='TAmerica' then PlayWith(TAmerica(AMan));
end;
(而且这样会违反开闭原则,造成将来的扩充需要修改代码)
,我想问这种情况下通过多态怎样使用和解决;
...全文
159 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
唐力伟 2004-09-09
  • 打赏
  • 举报
回复
o !!明白了,,,然后aman.palywith返回一个自己的实例...呵呵~谢了!!
asj 2004-09-08
  • 打赏
  • 举报
回复
是这样啊?多态的思想是再每个具体子类负责自己的职责,通过父类的接口统一调用服务。而如果你的每个子类中没有palywith的职责的话,你又要在一个地方统一处理,那自然不能用多态了。
可以这样写
TJapanChicken.playwith(aMan: TMan);
begin
aMan.playwith(Self);
end;
在每个子类中增加playwith。
唐力伟 2004-09-08
  • 打赏
  • 举报
回复
asj(最烦活稀泥):
你的意思是说无论怎样TMan必须知道它可以Playwith才能用到多态...
单单在TJapanChicken类中单方面的看见哪种man做哪种反映而是不能用多态的么?
如果不是这样,怎样回调能详细点么?
flyforlove 2004-09-07
  • 打赏
  • 举报
回复
没有代码,不知道你的错误是怎么回事,参考一下代码,看对你是否有帮助。

unit Unit1;

interface

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

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

TMen=class
procedure Say;virtual;
end;

TChina=class(TMen)
public
procedure Say;override;
end;

TAmerica=class(TMen)
public
procedure Say;override;
end;

TFrance=class(TMen)
public
procedure Say;override;
end;

TJapanChicken=class
public
procedure Playwith(obj:TMen);
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
C:TChina;
A:TAmerica;
F:TFrance;
J:TJapanChicken;
begin
C:=TChina.Create;
A:=TAmerica.Create;
F:=TFrance.Create;
J:=TJapanChicken.Create;
J.Playwith(C);
J.Playwith(A);
J.Playwith(F);
J.Free;
F.Free;
A.Free;
C.Free;

end;

{ TChina }

procedure TChina.Say;
begin
showmessage('speak Chinese!');
end;

{ TAmerica }

procedure TAmerica.Say;
begin
showmessage('speak English!');
end;

{ TFrance }

procedure TFrance.Say;
begin
showmessage('speak French!');
end;

{ TJapanChicken }

procedure TJapanChicken.Playwith(obj: TMen);
begin
obj.Say;
end;

{ TMen }

procedure TMen.Say;
begin

end;

end.
befree 2004-09-07
  • 打赏
  • 举报
回复
关注一下
asj 2004-09-07
  • 打赏
  • 举报
回复
在JapanChicken.playwith中再回调Man的playwith
然后通过多态实现
这种情况很常见的。

5,385

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧