德尔福的抽象

Iva*_*nov 1 delphi class

如果我有子类,子类继承父类的所有方法,但是如何使用父类中子类的函数?抽象是什么?我该如何完成它?

我的代码:

type
cParent = class(TObject)
private
  function ParentFunction:byte;
  function ChildFunction:byte;virtual;abstract;
end;

type
cChild = class(cParent)
private function ChildFunction:byte;override;
end;

function cChild.ChildFunction:byte;
begin
  Exit(20);
end;

function cParent.ParentFunction:byte;
begin
  Exit(10);
end;

var
c:cParent;

begin
  c:= cParent.Create;
  WriteLn(c.ChildFunction);
  Readln;
end.
Run Code Online (Sandbox Code Playgroud)

它编译文件,但我得到抽象异常.

sch*_*der 5

c:= cParent.Create;
WriteLn(c.ChildFunction);
Run Code Online (Sandbox Code Playgroud)

您可以在此处创建cParent类的实例.此类仅包含可由其他类重写的抽象ChildFunction.该函数未在cParent中实现,因此您会收到抽象错误.

如果你使用cChild类,代码可以工作,其中实现了ChildFunction:

c:= cChild.Create;
WriteLn(c.ChildFunction);
Run Code Online (Sandbox Code Playgroud)

为了澄清,想象一下GeometricObject使用虚拟抽象方法命名的父类CalculateVolume.您现在可以使用球体/框的公式创建类似SphereObjectBoxObject实现CalculateVolume的子类.但是创建一个GeometricObject和调用的实例是没有意义的CalculateVolume.

  • "virtual"表示该方法可以被子类重写."abstract"表示该方法不是由父类实现的,而是可以在子类中实现."覆盖",从父类重写虚拟方法.所有抽象方法都必须是虚拟的,但方法可以是虚拟的而不是抽象的. (2认同)