打开时间机器,参观古代:它是德尔福,它是2007年.
对于我们的初学者手册,我写下了编程的一些基本内容(使用Delphi).这样做我发现了一个怪癖,我不太明白.为了演示继承,我写了一个基类和它的继承人.重新引入功能,另一个功能被继承人覆盖.
unit UOverride;
interface
type
Base = class(TObject)
strict private
const
CName: String = 'Base-Class';
CMaxim: String = 'Somebody set up us the bomb.';
public
function GetName(): String; virtual;
function GetMaxim(): String; virtual;
end;
Heir = class(Base)
strict private
const
CName: String = 'Heir-Class';
CMaxim: String = 'All your Base are belong to us!';
public
function GetName(): String; reintroduce;
function GetMaxim(): String; override;
function GetBaseName(): String;
function GetBaseMaxim():String;
end;
implementation
{ Base }
function Base.GetMaxim: String;
begin
Result := CMaxim;
end;
function Base.GetName: String;
begin
Result := CName;
end;
{ Heir }
function Heir.GetMaxim: String;
begin
Result := CMaxim;
end;
function Heir.GetName: String;
begin
Result := CName;
end;
end.
Run Code Online (Sandbox Code Playgroud)
因此,当我创建Base的对象并调用too函数时,它按预期工作:
GetName()=> 基类 和GetMaxim()=> 有人给我们炸弹.对于继承人的实例也是如此:
GetName()=> 继承人 和GetMaxim()=> 你所有的基地都属于我们!现在我将我的Heir实例转换为Base并再次调用这两个函数.
GetName()=> 基类,不留任何问题和GetMaxim()=> 你所有的基地都属于我们!正如所料,因为它被Heir覆盖.出于好奇,我向继承人增加了两个功能.
function Heir.GetBaseName: String;
begin
Result := inherited GetName();
end;
function Heir.GetBaseMaxim: String;
begin
Result := inherited GetMaxim();
end;
Run Code Online (Sandbox Code Playgroud)
我希望GetBaseName()能给我Base-Class - 所以它发生了.因为GetBaseMaxim()我不确定.在我看来,有三件事是可能的
GetMaxim()从继承人告诉我你所有的基地都属于我们!.都没发生!我得到有人给我们炸弹.来自我的基础课程?!为什么?我认为这个功能被Heir覆盖了!这不是什么大问题,但我不太了解这种行为,因为它不能像我预期的那样工作.有什么解释吗?
Inherited给祖先函数提供非虚拟调度,这正是你观察到的.大多数情况下,它在后代类中使用的函数与被调用的继承函数具有相同的名称,但正如您所演示的那样,不需要该自定义.您可以从后代类中的任何位置非虚拟地调用任何继承的方法.
| 归档时间: |
|
| 查看次数: |
151 次 |
| 最近记录: |