gpt4 book ai didi

Delphi OOP 强制从继承类重新实现方法

转载 作者:行者123 更新时间:2023-12-03 18:07:29 25 4
gpt4 key购买 nike

我有一个 child 类TChildClass来自TBaseClass . TBaseClass有一个方法function foo: string;TChildClass必须始终执行!

IMyInterface = Interface(IInterface)
function foo: string;
end;

TBaseClass = class(TInterfacedObject, IMyInterface)
public
function foo: string;
end;

TChildClass = class(TBaseClass , IMyInterface)
public
function foo: string;
end;

我要 TChildClass始终执行 function foo并调用继承自 TBaseClass :
function TBaseClass.foo: string
begin
Result := 'Hello';
end;

function TChildClass.foo: string
begin
Result := inherited;

Result := Result + ' world!';
end;

怎么做?

最佳答案

你不能编译器在编译时要求覆盖。

为了 TChildClass覆盖 foo() , foo()需要声明为virtualTBaseClass (但也不是 abstract ,因为您希望 TBaseClass.foo() 具有默认实现,否则编译器会提示!)。而且,与 C++ 不同,Delphi 不需要重写抽象方法,它允许代码在运行时创建抽象类的实例(即使调用未被重写的抽象方法会导致运行时错误)。

但是,您可以 验证 在运行时是否 TBaseClass.foo()是否已在后代中被覆盖,例如:

type
IMyInterface = Interface(IInterface)
function foo: string;
end;

TBaseClass = class(TInterfacedObject, IMyInterface)
public
function foo: string; virtual;
end;

TChildClass = class(TBaseClass, IMyInterface)
public
function foo: string; override;
end;

function TBaseClass.foo: string;
type
TFoo = function: string of object;
var
Impl, Base: TFoo;
ClassTBase: TClass;
begin
Impl := foo;
ClassTBase := TBaseClass;
Base := TBaseClass(@ClassTBase).foo;
if TMethod(Impl).Code = TMethod(Base).Code then
raise Exception.CreateFmt('foo() not implemented in class ''%s''', [ClassName]);
Result := 'Hello';
end;

function TChildClass.foo: string;
begin
Result := inherited foo;
Result := Result + ' world!';
end;

但是,您对 无能为力。力 TChildClass.foo()调用 inherited , 严格到 TChildClass自行决定。

关于Delphi OOP 强制从继承类重新实现方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51137742/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com