Delphi覆盖

时间:2016-03-09 07:57:02

标签: delphi theory

打开你的时间机器并参观古代:它是德尔福,它是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.

因此,当我创建Base的对象并调用too函数时,它按预期工作:

  • GetName() => Base-Class
  • GetMaxim() => 有人为我们设置炸弹。

继承人的实例相同:

  • GetName() => 继承人
  • GetMaxim() => 您的所有Base都属于我们!

现在我将我的Heir实例转换为Base并再次调用这两个函数。

  • GetName() => Base-Class ,不留任何问题和
  • GetMaxim() => 您的所有Base都属于我们!正如所料,因为它被Heir覆盖。

出于好奇,我向继承人增加了两个功能。

function Heir.GetBaseName: String;
begin
  Result := inherited GetName();
end;

function Heir.GetBaseMaxim: String;
begin
  Result := inherited GetMaxim();
end;

我希望GetBaseName()能够给我 Base-Class - 所以它会发生。对GetBaseMaxim()我不确定。在我看来,有三件事是可能的

  1. 它不会编译并抛出错误或
  2. 它运行并且会因异常而失败(因为重写了继承的函数或
  3. 最期待它给我{1}}来自继承人告诉我你所有的基地都属于我们!
  4. 都不会发生!我得到了有人从我的基类中设置了炸弹。!为什么?我认为这个功能被Heir覆盖了!这不是什么大问题,但我不太了解这种行为,因为它不能像我预期的那样工作。那里有任何解释吗?

2 个答案:

答案 0 :(得分:5)

<input ng-keypress=keypressed($event) ng-model="verificationCode"> $scope.keypressed = function(event) { if (event.keyCode === 13) enteredVerificationCode() } 为祖先函数提供非虚拟调度,这正是您所观察到的。大多数情况下,它在后代类中使用的函数与被调用的继承函数具有相同的名称,但正如您所演示的那样,不需要该自定义。您可以从后代类中的任何位置非虚拟地调用任何继承的方法。

答案 1 :(得分:5)

这没什么特别的。使用inherited,您可以请求实现基类。

documentation说:

  

如果继承后跟成员名称,则表示a   普通方法调用或引用属性或字段,但不包括   搜索引用的成员从立即开始   封闭方法的祖先