delphi中对override(重写)和overload(重载)的一些看法

 重写就是用现在的方法覆盖了继承过来的方法,重载就是在不改变继承过来的方法的基础上重新添加一个方法名字一样,但参数或返回值是不一样的。

下面举个例子:

unit Unit1;

interface

type TStudent
= class
private
//...
    public
//...
procedure test;
   
implementation
 
   procedure test;
   begin
   showmessage('我是父亲');
   end;
end
.

我写了一个类TStudent是继承自TObject的,TObject有一个Create构造函数。然而我现在要在TStudent类中重载这个构造函数,我们可以在类的public部分加上constructor Create(FSTR:string);overload;写这个重载的构造函数的实现(写在implementation下面)

constructor TStudent.Create(FSTR: string);
begin

showmessage(FSTR);

 

end;

然后在创建这个类的实例的时候就会有两个Create构造函数可选,一个没有参数的,一个是带参数的。这就是构造函数的重载。

下面说下override,现在有一个类继承自上面定义的TStudent类,然后要重写test这个procedure(注意,只有在public或是protected部分声明的才可以被子类继承,如果test被声明在private部分就不能被子类继承):

unit Unit2;

interface

type
Tstu1
= class(TStudent)
private
//...
public
procedure test;override;

implementation

procedure test;
begin
inherited;
showmessage(
' 我是儿子 ' );
end;
end
.

在override时,如果override的是procedure,则加上关键字inherited; 就会执行父类同名procedure的所有过程,然后再执行子类中特有的过程,如果override的是function则不会执行父类中同名function的内容.这一点要注意下

本人也是初学DELPHI,好象上面的东西描述的不是很准确,只是个人摸索的结果,希望不要误导大家,还是要多去看下DELPHI面向对象编程概念。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
DELPHI方法的类型及其覆盖、重载 1、静态方法是方法的缺省类型,对它就像对通常的过程和函数那样调用,编译器知道这些方法的地址,所以调用一个静态方法时它能把运行信息静态地链接进可执行文件,所以,静态方法速度最快,但它们却不能被覆盖来支持多态性。 2、虚拟方法和静态方法的调用方式相同。由于虚拟方法能被覆盖,在代码调用一个指定的虚拟方法时编译器并不知道它的地址,因此,编译器通过建立虚拟方法表(VMT)来查找在运行时的函数地址。所有的虚拟方法在运行时通过VMT来高度,一个对象的VMT表除了自己定义的虚拟方法外,还有它的祚的所有的虚拟方法,因此虚拟方法比动态方法用的内存要多,但它执行得比较快。 3、动态方法跟虚拟方法基本相似,只是它们的高度系统不同。编译器为每一个动态方法指定一个独一无二的数字,用这个数字和动态方法的地址构造一个动态方法表(DMT)。不像VMT表,在DMT表仅有它声明的动态方法,并且这个方法需要祖先的DMT表来访问它蓁的动态方法。正因为这样动态方法比虚拟方法用的内存要少,但执行起来罗慢,因为有可能要到祚对象的DMT查找动态法。 4、OP通过覆盖使一方法在不同的派生类间表现出不同的行为。OP能被覆盖的方法是在声明时被标识为virtual或dynamic的方法。为了覆盖一个方法,在派生类的声明override代替virtual或dynamic。用了override后,编译器就会用新的方法替换VMT原先的方法,而原先的方法也还存在,而如果用override再次声明一个静态方法,则是真正的覆盖,是用新的方法完全替换在祖先类的同明方法。 5、方法重载的意义:比如说,你要写一个求两数商的函数(当然只是个比喻),你希望这个函数可以处理所有的数值类型,但PASCAL的运算对类型实行严格检查,你不得不用不同的程序来运算不同类型的数值,这样你就必须为每一种类型写一个同样功能的函数,并使用不同的函数名,坏处我想你是知道的。而重载却可以解决这个问题,同样的函数名,编译器可以用不同的形参类型决定调用哪个函数。Top dynamic和virtual的不同之处 delphi动态虚拟覆盖重载重定义的区别 (www.ip8000.com www.sql8.net)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值