德尔福的抽象

时间:2009-07-15 10:38:31

标签: 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.

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

5 个答案:

答案 0 :(得分:5)

c:= cParent.Create;
WriteLn(c.ChildFunction);

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

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

c:= cChild.Create;
WriteLn(c.ChildFunction);

为了澄清,假设一个名为GeometricObject的父类具有虚拟抽象方法CalculateVolume。您现在可以使用球体/框的公式创建实现SphereObject的{​​{1}}或BoxObject子类。但是创建CalculateVolume的实例并调用GeometricObject

是没有意义的

答案 1 :(得分:2)

您创建cParent类的实例。这个类没有childFunction的实现。 c必须是cChild类的实例。 正确的代码: c:= cChild.Create; WriteLn(c.ChildFunction);

答案 2 :(得分:1)

使用子类创建实例:

c:= cChild.Create;

答案 3 :(得分:0)

在我看来,你混淆了继承关系和占有欲关系。如果您将类“cChild”定义为继承自“cParent”类,则类“cChild” 是“cParent”,并不意味着“Parent”类可以访问任何子级类。你可以在类“cParent”中调用抽象函数“ChildFunction”的唯一方法来自另一个函数,例如“ParentFunction”,但仅限于Object本身不是“cParent”:

function cParent.ParentFunction:byte;
begin
  Result := ChildFunction * 2;
end;

var
  c:cParent;

begin
  c:= cChild.Create;
  WriteLn(c.ParentFunction);
  Readln;
end.

这里,由于c是cChild,因此ParentFunction正确调用了在cChild中定义的ChildFunction。

答案 4 :(得分:0)

回应schnaader,关于CS 101:

“virtual”表示该方法可以被子类重写。

不仅如此,非虚拟函数可能会被子类重写。差异非常重要:当父类调用虚函数时,将执行CHILD函数。这允许子类实现将由父类调用的函数,而父类不知道它们的任何信息。这是多态性的本质。