override与覆盖当然不同,override一般是与多态性联系在一起的,给你一个《Delphi4编
程技术内幕》中的例子,如下
unit main;
interface
uses
Windows, Messages, SysUtils,
Classes, Graphics, Controls,
Forms, Dialogs, StdCtrls;
type
TForm1 = class(TForm)
bPolymorph: TButton;
procedure bPolymorphClick(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
type
TParent = class(TObject)
procedure Draw
virtual;
end;
TChild = class(TParent)
procedure Draw
override
procedure ShowHierarchy
virtual;
end;
procedure TParent.Draw;
begin
ShowMessage('Parent Draw');
end;
procedure TChild.Draw;
begin
ShowMessage('Child Draw');
end;
procedure TChild.ShowHierarchy;
begin
ShowMessage('Child Show Hierarchy');
end;
procedure CallDraw(O: TParent);
begin
O.Draw;
end;
procedure FreeObject(O: TObject);
begin
O.Free;
end;
procedure TForm1.bPolymorphClick(Sender: TObject);
var
Child: TChild;
Parent: TParent;
begin
Child := TChild.Create;
Parent := TParent.Create;
CallDraw(Parent);
CallDraw(Child);
FreeObject(Child);
FreeObject(Parent);
end;
end.
这个例子说明了override在多态性中的作用。
我只说明一下,如果子类中的方法没有声明为override,则在子类的实例中直接调用此方法时
,就会覆盖掉父类中的同名方法。但是,上面的情况下,如果TParent中的Draw不是virtual,
TChild的Draw没有override,则调用的将是父类中的同名方法,哪怕是用子类的一个实例去
调用。你自己运行体会一下。
至于这个问题:那类方法与普通的类中定义的方法用法上有啥不同?
回答如下,类方法可以在类的实例没有创建的时候就引用。由于类方法不依赖于任何对象
实例,因此,类方法的代码不能访问类的字段。其实很多类方法,如ClassName、ClassParent、
ClassInfo等等,都是用来取得运行期类型信息(RTTI)的,因为这些信息独立于对象实例,
是相对固定的。
在类方法中,除了一般的参数外,实际还隐含传递了一个叫SELF的参数,这个参数代表
声明这个类方法的类。。SELF是一个类,不是对象,因此不能用SELF访问类的字段、特性和
一般的方法,但可以用SELF来引用类的构造和其他类方法。
类方法也可以由对象实例来引用,这时,SELF参数传递的是对象实例的类。
OK?