我正在使用一个包含许多抽象类的组件套件。现在我想应用多态,但是在创建对象时我得到了错误抽象类。
即使我不需要,我是否应该覆盖所有虚拟方法?有没有解决方法或解决方案?
答案 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)
如果
,你的后代类仍然是抽象的abstract
或答案 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;