Delphi中的抽象类

时间:2011-05-31 11:41:44

标签: delphi abstract delphi-2009

我正在使用一个包含许多抽象类的组件套件。现在我想应用多态,但是在创建对象时我得到了错误抽象类。

即使我不需要,我是否应该覆盖所有虚拟方法?有没有解决方法或解决方案?

4 个答案:

答案 0 :(得分:25)

为了创建类的实例,您需要覆盖声明为虚拟抽象的所有方法。即使你不使用它们。

如果你真的想要一个解决方法,你可以使用空方法。但我不会推荐这个。

并添加有关该主题的更多信息:

如果使用虚拟摘要声明方法,则该方法是抽象的:

procedure MyMethod(const AMyParameter: Integer); virtual; abstract;

Trivia:您甚至可以将方法覆盖为抽象:

procedure MyMethod(const AMyParameter: Integer); override; abstract;

您需要覆盖这些方法才能从该类实例化。

你可以将整个类声明为抽象:

type
  TMyClass = class abstract (TMyAncestor)
  end;

如果您尝试实例化该类,则会收到警告。

对方是密封的班级:

type
  TMyClass = class sealed (TMyAncestor)
  end;

如果您尝试从该类继承,则会收到警告。

你也可以密封方法,但你需要关键字final。

procedure MyMethod(const AMyParameter: Integer); override; final;

答案 1 :(得分:5)

Delphi没有抽象类,只有抽象方法。如果调用抽象方法,则会引发抽象方法异常。

简单地说,你不能调用抽象方法。如果编译器检测到您使用抽象方法实例化类,则编译器会发出变暖。好的做法是让编译器将这些警告变成错误。

答案 2 :(得分:1)

如果

,你的后代类仍然是抽象的
  1. 声明abstract
  2. 它至少有一个声明为abstract的方法,或
  3. 它不会覆盖并实现其祖先的所有抽象方法

答案 3 :(得分:0)

如果覆盖抽象构造函数,它会产生错误,因为它会自动将继承到新的构造函数中,如果你使用代码自动完成,它当然会调用抽象构造函数。

e.g。

type
  TMyclass = class (TObject)
  public
    constructor Create(AOwner : TComponent); dynamic; abstract;
  end;

  TMyclass2 = class(TMyclass)
  public
    Constructor Create(AOwner : TComponent); override;
  end;

implementation

constructor TMyclass2.Create(AOwner: TComponent);
begin
  inherited;

end;