关于多态性,winxkm(蹩脚的程序员)和sanmaotuo(老冯)认识不同,我迷糊了,请高手指点!

比如我创建了6个类分别是:
A1,A2,A3,A4,A5,A,A是前面A1..5的父类。
在程序中我的子类A1..A5都有相同的几个过程或函数名称,但是实现的代码不同。我在调用的时候是否可以将子类赋值给A 比如:A:=A1
然后统一用A来调用这些函数,A父类中也有这些函数! 请高手帮忙指导!!

×××××××××××××××××××××××××××××××××
winxkm(蹩脚的程序员)的观点:
楼上的认识我不赞同,认识多态性是非常有必要的 这是整个object pascal语言中最重要的特征之一。特别在希望创建组件来说!
多态性与OOP的关系就好比指针与C或object pascal的关系一样。
如果你不了解指针,则好比你至少丢掉了一般的C或者object pascal语言的功能。
同样,如果你不了解多态性,你将对OOP的理解没有真正意义上的明白。这样技术的应用只能打到一半功效!
××××××××××××××××××××××××××××××××××

sanmaotuo(老冯)的观点:
这个问题我个人觉得没有讨论的必要。虽然可以调用,但这是本目倒置的。 在VCL中就有这样处理的,但这是当时VCL设计上的缺陷造成这样处理的,严重违背了DIP(依赖倒置原则)。

这是winxkm 鳖大哥给的解释:

这是一个关于delphi中多态性的问题,不知道楼主这方面study过没有!
多态性比较难以理解!
它允许你将父类对象设置成为和一个或更多个它的子类对象相等的技术
也就是说parent:=child
比如说,一个父类定义了一些函数,它的所有后代都继承了这些函数。按照楼主说的,想通过父类实例来调用统一的函数,这样不是不可以,这样调用总是成功的,但是,之前赋值是必要的。这样parent才能找到正确的函数地址。(注意:不能parent不能调用parent中没有定义的函数或过程)
这里你需要了解VMT。就是虚拟方法指针列表。
如果在parent中定义了 procedure GetobjectCaption;virtual;
所有继承的子类都拥有父类在VMT中虚方法的指针列表。不知道我这么说你还能明白!
子类在继承的时候,是需要override
这里我来举例说明比较直观:
type
Tparent=class(TObject)
procedure draw;Virtual;
end;
type Tchild=class(Tobject)
procedure draw;override;
procedure draw2;virtual;
end;

procedure Tparent.Draw;
begin
showmessage('parent.draw');
end;
procedure TChild.draw;
begin
showmessage('child.draw');
end;
procedure Tchild.draw2;
begin
showmessage('child.draw2');
end;
diaoyong调用的时候如:
var
P:Tparent;
C:Tchild;
begin
c:=Tchild.create;
p:=Tparent.create;
P:=C;
P.draw; //正确的,显示 child.draw;
P.draw2;//错误的,
end;

[2131 byte] By [rocxu007] at [2008-1-9]
# 1
都没有错啊
trainbox-rain at 2007-10-19 > top of Msdn China Tech,Delphi,VCL组件开发及应用...
# 2
晕了, 我说楼主 其实你应该找本书好好看看多态性,delphi就是对象化的pascal。所有的组件的以及作为父类的对象,他们的功能具有前占性,这是在设计上的结构完善的表现。则后面的子类代码无须在设计的时候完成重复的功能,对部分功能不满意,可以通过override来 inherited Create(AOwner);这个方法。加入自己需要改进的部分代码。这样 你的子类完成了父类的初步要求,还可以完成子类所需要补充的功能。
楼主使用了这样的技术,现在看来是没有多少用处,但是在于代码的可重用性上,组件的有效创建上绝对是思想先进呀 哈哈!
winxkm-蹩脚的程序员 at 2007-10-19 > top of Msdn China Tech,Delphi,VCL组件开发及应用...
# 3
多态性,就像生物学的分类一样,
抽象出共同的特征和行为.
trainbox-rain at 2007-10-19 > top of Msdn China Tech,Delphi,VCL组件开发及应用...
# 4
trainbox(rain) 非常准确的概括了这个多态性的特征。看来也是应用比较多的
winxkm-蹩脚的程序员 at 2007-10-19 > top of Msdn China Tech,Delphi,VCL组件开发及应用...
# 5
呵呵,又来一贴。看来楼主是准备空仓迎接新年哈。这个话题多说也没有什么太大意义,是属于老生常谈了。还是自己多多的实战OO吧, 很多模糊的概念就会变得越来越清晰。只有这样你 才会更多的理解DELPHI作为一个优秀的OOP开发语言的博大精深,而不会去开一辈子的拖拉机。
sanmaotuo-老冯 at 2007-10-19 > top of Msdn China Tech,Delphi,VCL组件开发及应用...
# 6
经典的描述《易经》

上德无为,不以察求。
下德为之,其用不休。
sanmaotuo-老冯 at 2007-10-19 > top of Msdn China Tech,Delphi,VCL组件开发及应用...
# 7
呵呵,说得是,不赞同老冯的意见,不如把分数直接撒给我们吧 呵呵!
winxkm-蹩脚的程序员 at 2007-10-19 > top of Msdn China Tech,Delphi,VCL组件开发及应用...
# 8
楼主不用迷糊,别人怎么说是别人的事,你想怎么做是你的事,如果觉得为难的话,分给我,然后去做你应该做的事,一切迎刃而解!
maozefa-阿发伯 at 2007-10-19 > top of Msdn China Tech,Delphi,VCL组件开发及应用...
# 9
maozefa(阿发伯) 可能你的技术比较牛,但是如果你会的话就教我好了,用不着这样语带粉刺。很不喜欢你这样的人。 感谢鳖大哥和老冯大哥的帮助,对了还有trainbox(rain) ,谢谢你们!
我一直想自己做一个关于OPenGL方面的组件,所以许多问题问的比较多了,我原来是用C做通信的,delphi刚学几个月,忒不好用,可能是我技术或者习惯问题。希望早日在诸位大哥的帮助下克服!
rocxu007 at 2007-10-19 > top of Msdn China Tech,Delphi,VCL组件开发及应用...
# 10
比如我创建了6个类分别是:
A1,A2,A3,A4,A5,A,A是前面A1..5的父类。
在程序中我的子类A1..A5都有相同的几个过程或函数名称,但是实现的代码不同。我在调用的时候是否可以将子类赋值给A 比如:A:=A1
===================================================================================
不用讨论理论了,你说的完全没错,只要A1..A5中相同的几个过程或函数名称都是从A的虚方法或者动态方法override的,通过A := A1;A.方法;就没有问题了。
maozefa-阿发伯 at 2007-10-19 > top of Msdn China Tech,Delphi,VCL组件开发及应用...
# 11
用不着这样语带粉刺。很不喜欢你这样的人。
============================================================================
楼主真是晕,我上面说的除了“分给我”是句玩笑话,其它都是至理名言!!
“楼主不用迷糊,别人怎么说是别人的事,你想怎么做是你的事,如果觉得为难的话,分给我,然后去做你应该做的事,一切迎刃而解!”。
楼主自己想想上面的话吧,就是说,你的理解是正确的,找你自己的做!
maozefa-阿发伯 at 2007-10-19 > top of Msdn China Tech,Delphi,VCL组件开发及应用...
# 12
说句大实话,我觉得你缺乏举一反三的能力,这是一个优秀编程人员必备条件之一,楼主好自为之了!
不用给我分!
maozefa-阿发伯 at 2007-10-19 > top of Msdn China Tech,Delphi,VCL组件开发及应用...
# 13
呵呵,火药味都出来了,各打50大板,希望阿发伯不要生气, 楼主既然有求于人,为何还要斤斤计较呢 这可不是好事呀, 当然阿发伯大哥似乎开了个不恰当的玩笑。 我建议化干戈为玉帛。同意,就各顶一句!! 哪怕分数不要也没关系! 团结才重要对不对。

另外我个人感慨, 程序员其实没什么了不起。就是一个技术民工。 要做的出色不是件容易的事情, 我现在基本上不怎么写代码 都是下面的人做,手也开始生了,但是思路,设计架构非常重要,这与一个人的思维和性格有关,这里我还是蛮欣赏rocxu007的,虽然是delphi新手,但是大胆使用类似于多态性方面的技术还是很值得提倡。存在即是真理,既然有这样的技术那我们就好好专研并发挥它的最大效能。

好的程序员不是技术有多高,而是钱拿多少 哈哈!!
winxkm-蹩脚的程序员 at 2007-10-19 > top of Msdn China Tech,Delphi,VCL组件开发及应用...
# 14
to winxkm(蹩脚的程序员)

我的确有点生气,楼主显然对多态性不是很深刻,而且,刚从C转到Delphi,显然面向过程的编程思维会影响他理解这个问题,而多态性本身是个比较复杂的问题,光凭书本知识的感性认识显然是不够的,而你和老冯的观点不一致有导致他犯迷糊,我的言下之意是暂时不要考虑理论问题,照他自己的理解做,实际是肯定他上面的理解没有错误,何必要理论明白了再去做呢?可能话说的幽默了点,但是在你们观点不一致的情况下,我不便发表我的看法。
maozefa-阿发伯 at 2007-10-19 > top of Msdn China Tech,Delphi,VCL组件开发及应用...
# 15
呵呵,我理解阿发伯, !不知道楼主看到没有,人家解释得到位了 呵呵 楼主该道歉了! 大家作个朋友不是很好吗? 祝大家元旦happy!
winxkm-蹩脚的程序员 at 2007-10-19 > top of Msdn China Tech,Delphi,VCL组件开发及应用...
# 16
呵呵,不管maozefa(阿发伯)说得对不对,毕竟是我失礼了 抱歉!请maozefa(阿发伯)不要生气。我郑重向你道歉 我以前是用C,C#的 刚学delphi才将近2月。所以许多习惯都需要改变! 但是对于你说我脑经转不过来 我不承认,呵呵 至少我正在试着来深入的了解OOP。就想鳖大哥说的一样。

正如鳖大哥说的那样,希望您们能够多多指导我这个新手,在此 向你和鳖大哥致敬! 对了还有老冯
rocxu007 at 2007-10-19 > top of Msdn China Tech,Delphi,VCL组件开发及应用...
# 17
对不起,我最后的回复说话是重了,但绝不是恶意的
maozefa-阿发伯 at 2007-10-19 > top of Msdn China Tech,Delphi,VCL组件开发及应用...
# 18
和谐Codefund,创造中国程序员和谐一面 呵呵! 楼主要多给分我们呀 呵呵 不过我估计你也没什么分了,一天发了4贴 我算了一下整200分 真是有分没处化呀
winxkm-蹩脚的程序员 at 2007-10-19 > top of Msdn China Tech,Delphi,VCL组件开发及应用...
# 19
一天发了4贴
======================================================
我不知道,要知道楼主这种弃而不舍的精神,我也不会说那种自以为幽默的话,更不会有最后的...,再次向楼主道歉!不过,也不要死学。
maozefa-阿发伯 at 2007-10-19 > top of Msdn China Tech,Delphi,VCL组件开发及应用...
# 20
嗯 那就尽量利用,还有一疑问:
我服务器有一个数据库,用户数量太庞大,所有远程客户端都没有直接连接在服务器数据库上,我现在是通过socket来发送数据传送命令请求和发送,但是数据量大了之后我的线程出现了卡机现象。如何解决大数据量的快速的数据传送,不知道你们有什么好的办法?
rocxu007 at 2007-10-19 > top of Msdn China Tech,Delphi,VCL组件开发及应用...
# 21
http://blog.Codefund.cn/panaimin/archive/2006/12/30/1469373.aspx
看一下番爱民的这篇文章,虽然讲的学生如何学习计算机,但对于出来工作的人同样有用。

不要抱着面向对象这根救命稻草,想一想,在没有面向对象的时代,操作系统是怎么作出来的,数据库是怎么做出来的,编译器是怎么做出来的。更何况我们做的东西往往都不能与那些软件相比。

拿排版软件来说,Word与WPS都是基于COM这种面向对象的技术做出来的,而高德纳的Tex是使用面向过程的Pascal做出来的。但是Word在功能与稳定性上根本就不能与Tex相比。你能说面向对象就一定比面向过程好吗。

推荐书籍:《编码的奥秘》, 是Windows Programming那个作者写的哦,说得夸张一点,他在教计算机是怎么做出来的!
# 22
to rocxu007()

数据库的东西我做过,但都是数据量不太大的,其他人我不了解,老冯这方面经验很丰富,你可以发短信向他讨教
maozefa-阿发伯 at 2007-10-19 > top of Msdn China Tech,Delphi,VCL组件开发及应用...
# 23
嗯! 我也没什么好办法,我做的数据量也不大,这还需要看服务器,带宽怎么样,我的意思你最好不要一次性把数据加载到客户端,类似于web平台,你可以通过建立自己的通信协议标准,将当前界面需要填充的数据,和需要处理的数据打包发送过来!
winxkm-蹩脚的程序员 at 2007-10-19 > top of Msdn China Tech,Delphi,VCL组件开发及应用...
# 24
按楼主说法,好像用的是3层的方式,如果确实是数据量大影响效率,可用多台服务器,运行多个应用服务器分流来减轻网络负担的。
maozefa-阿发伯 at 2007-10-19 > top of Msdn China Tech,Delphi,VCL组件开发及应用...
# 25
谢谢2位,我们单位条件有限,没那么多服务器,就2台,按照maozefa(阿发伯)大哥的方法 如果做成M-N-2这样的结构的话,是可以的,我现在做的就是这样的结构,但是数据量还是有限 不能满足要求。 winxkm鳖脚大哥的提议有点类似于我以前做通信软件的感觉,不过是个解决办法,但是这样的话我的程序改动量就很大了!
rocxu007 at 2007-10-19 > top of Msdn China Tech,Delphi,VCL组件开发及应用...
# 26
to:winxkm(蹩脚的程序员)

过奖过奖
trainbox-rain at 2007-10-19 > top of Msdn China Tech,Delphi,VCL组件开发及应用...
# 27
A1,A2,A3,A4,A5,A,A是前面A1..5的父类。
在程序中我的子类A1..A5都有相同的几个过程或函数名称,但是实现的代码不同。我在调用的时候是否可以将子类赋值给A 比如:A:=A1
然后统一用A来调用这些函数,A父类中也有这些函数! 请高手帮忙指导!!

这个赋值不赋值无所谓的,A。draw能调用说明了A有这个函数draw,而不用管它是A1,A2
还是其他,
A := A1说明了A这个变量指向的是A1的一个实例,A。draw调用的是A1。draw的实现,而不是A。draw的实现,当然也可以直接调用A1。draw

为什么还用用A。draw来调呢,因为我们运行的时候可能不知道要调用A1,A2还是其他

其实多态性就是简化了代码的编写,本来呢,如果不用多态,可能要这样写(很多地方都要这么写)

case Atype of
1: A1.draw;
2: A2.draw;
...
end

用了多态后,就可以这样写一个地方这么写,其他地方就这样调用A。Draw就可以了

起了简化代码的作用

trainbox-rain at 2007-10-19 > top of Msdn China Tech,Delphi,VCL组件开发及应用...
# 28
各位高手,抱歉没能及时给大家分,回家过年了 嘿嘿
rocxu007 at 2007-10-19 > top of Msdn China Tech,Delphi,VCL组件开发及应用...