Delphi中的抽象类

mar*_*stT 15 delphi delphi-2009 abstract

我正在使用具有许多抽象类的组件套件.现在我想应用多态,但是在创建对象时我得到了错误抽象类.

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

Too*_*the 25

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

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

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

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

procedure MyMethod(const AMyParameter: Integer); virtual; abstract;
Run Code Online (Sandbox Code Playgroud)

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

procedure MyMethod(const AMyParameter: Integer); override; abstract;
Run Code Online (Sandbox Code Playgroud)

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

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

type
  TMyClass = class abstract (TMyAncestor)
  end;
Run Code Online (Sandbox Code Playgroud)

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

对应的是密封类:

type
  TMyClass = class sealed (TMyAncestor)
  end;
Run Code Online (Sandbox Code Playgroud)

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

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

procedure MyMethod(const AMyParameter: Integer); override; final;
Run Code Online (Sandbox Code Playgroud)

  • 我认为你不必实现所有抽象方法,只要你不调用它们.它只是给你一个编译器警告.如果在运行时调用,则引发`EAbstractError`. (6认同)
  • 我想你需要查看这个答案中陈述的事实 (3认同)

Dav*_*nan 5

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

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

  • @David,不完全是,您可以使用TMyClass = class abstract(TMyParent)创建一个抽象类(即使没有抽象方法)... (4认同)
  • @johan项目选项,提示和警告,任何变暖都可以转换为错误 (2认同)
  • @Z80我认为将类标记为抽象并没有多大作用。这不是 .net 时代的后遗症吗? (2认同)