我是刚学delphi的菜乃哦,有些问题想请教(100分)

  • 主题发起人 主题发起人 不是云
  • 开始时间 开始时间

不是云

Unregistered / Unconfirmed
GUEST, unregistred user!
1,虚拟方法和静态方法有什么不同?子类用关键字override覆盖父类的虚拟方法,执行自己的方法,而静态方法也可以覆盖父类的方法执行自己的方法,有什么不同?
2,重载方法的意义何在?我一直没有想通,我完全可以使用不同的方法名执行不同的方法,为什么要使用相同的方法名来重载呢?
以上是小弟的迷惑,请大虾指点
 
1: 虚拟方法可以被子类override而静态方法不能
当然你可以将其覆盖,但是:
TTest = class(TObject)
A: procedure Dispatch(var Message)


B: procedure Dispatch(var Message)
override;
end;
var Test: TTest;
procedure TestProc(Sender: TObject);
var
Msg: TMessage;
begin
Sender.Dispatch(Msg)
//如果是A(覆盖): 则此处实际调用的是TObject.Dispatch
//如果是B(override): 则此处实际调用的是TTest.Dispatch
//面向对象就是将接口与组件分开,并且组件实现多态,
//调用相同的接口有不同的表现而覆盖是不行的
end;

TestProc(Test)

2:重载方法的意义是为了方便,用相同的方法名实现相似的功能
你当然可以使用不同的方法名执行不同的方法
 
to AoRoA:
类中的方法是不是一定要定义?我写的类中方法没有定义就不能通过编译,如果定义了
每个子类的方法,那不管有没有用override关键字,都调用自己的方法,不调用父类的方法
 
可以只声明不实现
用virtual
abstract
定义成纯虚方法
 
如你所说
“可以不管有没有用override关键字,都调用自己的方法,不调用父类的方法”
当然可以这么做!而且肯定可以实现

但是:
“面向对象就是将接口与组件分开,并且组件实现多态”
我们提供的是接口或父类,绝大多数时候都不是具体的实现类
那样的话就成了实现类和实现类的直接关联,
而不是接口和接口的关联
 
to AoRoA
对不起,我的脑袋有点晕,等我想清楚再给你加分,实在想不通也加分,谢谢你的帮助
 
呵呵,我记得有一本书叫着<<DELPHI4技术内幕>>还是什么的,那本书写得很清楚,你能找到看
一下最好。我现在都还想看,可惜没有找到。
 
to 不是云:
不好意思,我也是半懂不懂的,不能说得更通俗一点

TA = class(TObject)
//接口类/父类(或纯接口),声明接口函数,不实现
TB = class(TA)
//实现类/子类, 实现具体功能,override父类中的方法
TC = class(TObject)
//接口类/父类(或纯接口),声明接口函数,不实现
TD = class(TC)
//实现类/子类, 实现具体功能,override父类中的方法
其实你上面说的两点都是行得通的(不用override和overload)
但是在大一点的软件中,功能块和功能块之间的交互肯定是定义成TA<-->TC
而不是TB<-->TD,这样有利于封装、维护
而象你说的方法只能是TB<-->TD(实现类和实现类的直接关联)

to zhangkan:
这种概念dephi、C++、Java都一样
 
接受答案了.
 
后退
顶部