请教关于面向对象的一些基本概念(100分)

L

liwei

Unregistered / Unconfirmed
GUEST, unregistred user!
谁能够帮我解释一下OVERLOAD,OVERRIDE,VIRTUAL,REINTRODUCE
这些关键字的差别? 各是干嘛的?


看下面的程序:

units unit1;

interface

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

type

TMyObject = class(TObject)
public
procedure DoSomething(I: Integer)
VIRTUAL;
// 上面这个VIRTUAL, 改成OVERLOAD也行。
// 那么它们有什么不同?

end;

TAnimal = class(TMyObject)
public
procedure DoSomething(S: string)
reintroduce
overload;
// 上面这个REINTRODUCE如果删掉,程序也不会出错。
// 它究竟有什么用?

end;

TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Edit2: TEdit;
Label1: TLabel;
Label2: TLabel;
Bevel1: TBevel;
Bevel2: TBevel;
Bevel3: TBevel;
procedure Button1Click(Sender: TObject);
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
Animal: TAnimal;
begin
Animal := TAnimal.Create;
Animal.DoSomething('Cat')
// calls TAnimal.DoSomething
Animal.DoSomething(7)
// calls TMyObject.DoSomething
end;

{ TMyObject }

procedure TMyObject.DoSomething(I: Integer);
begin
Form1.Edit1.Text := IntToStr(i);
end;

{ TAnimal }

procedure TAnimal.DoSomething(S: string);
begin
Form1.Edit2.Text := S;
end;

end.
 
H

huizhang

Unregistered / Unconfirmed
GUEST, unregistred user!
Abstrace, Virtual, Dynamic, Override, Reintroduce, 这5个保留字都是用来
说明继承方法的。

首先,能够被继承的方法(functions and procedures)必须在Protected,Public
部分使用。

当你声明一个类的时候,你希望某些方法在它的子孙类中能够被继承并且
重新写过或添加内容,那么就给这个方法的后面加上Virtual或Dynamic。Virtual
和Dynamic在功能上是一样的,只是Virtual从速度上优化算法,而Dynamic是从减少
尺寸的角度考虑的。

当你继承一个父类的时候你可以继承某个方法并且添加上你的新功能。这时候就需要
重写这个方法,一般情况下要使用Override,否则编译的时候将提出警告,警告你用
静态的方法覆盖了父类的Virtual方法。如果你忘记了加上Override,则在以后继承
你的这个类的时候就不能继承地重写这个方法了。如果你有意地要用静态的方法方法
替换一个虚拟方法而不让编译是提出警告,则你可以使用ReIntroduce来通知系统。

至于那个OverLoad,则与继承无关,它的意义是一个方法可以使用不同类型的参数来
调用。比如求最大值函数有两个参数,通过Overload可以为他写一个求整数,一个求实数最大值的函数:
function Max(a, b: integer): integer
overload;
function Max(c, d: double): double
overload;
使用Overload的时候, 应该注意调用参数的数目应该一样。

此外,Virtual,Dynamic方法在写某个基类的时候可以暂时不写implementation部
分,子类继承它的时候则要求必须写具体的代码。这个时候用Abstrat表示。
 
J

Jams

Unregistered / Unconfirmed
GUEST, unregistred user!
要想了解更详细的内容,再请参阅"面向OOP编程技术"一书,在那你能得到满意的
结论。
 
L

liwei

Unregistered / Unconfirmed
GUEST, unregistred user!
to: huizhang

多谢! 多谢!

TO: JAMS

我就是看书看得晕晕的, 才来问的. :)
 
L

liwei

Unregistered / Unconfirmed
GUEST, unregistred user!
接受答案了.
 

Similar threads

顶部