gpt4 book ai didi

delphi - 如何强制后代类直接使用祖先方法或有一个不调用继承的新实现?

转载 作者:行者123 更新时间:2023-12-02 13:05:06 24 4
gpt4 key购买 nike

我们有 TAncestor 类,它有一个虚拟方法 GetFile。
我们将有一些 TDescendant = class(TAncestor) ,它可能会覆盖 GetFile。
我们希望确保在这种情况下,那些重写的方法不会在其实现中调用继承。
但如果他们不实现 GetFile 而只是使用 TAncestor 中的 GetFile,那就没问题。
有没有一种(简单的)方法可以做到这一点?

为了更清楚地说明:
- 是的,文档明确表示“不要在您的后代类中使用继承”
- 我无法控制其他人在覆盖时将编码的内容,并且不依赖他们阅读文档
- 我无法将执行限制为确切的 TAncestor 类,因为如果后代不提供自己的实现,则使用它是合法的
- 我无法使其抽象,因为它需要有一个默认实现
- 我想通过在基类中检测通过后代重写实现调用代码的方法来强制执行此操作
- 查看堆栈似乎有些过分,但这是我迄今为止的第一个想法

最佳答案

没有。没有办法强制您控制之外的代码调用原本可以完全访问的内容。您能做的最好的事情就是强烈反对类(class)文档中的这种做法。

如果后代调用继承的方法会产生什么后果?如果这意味着程序停止工作,那就这样吧。编写后代类的程序员将测试代码,注意到它不起作用,然后查阅该方法的文档以确保他正确使用它(此时他会知道他没有正确使用)。

您可以采取另一种方法。不要使函数成为虚拟函数并让后代重写它,而是提供 protected 方法指针属性。

type
TGetFileImpl = procedure of object;

TAncestor = class
private
FGetFile: TGetFileImpl;
protected
property GetFileImpl: TGetFileImpl write FGetFile write FGetFile;
public
procedure GetFile; // not virtual.
end;

TDescendant = class(TAncestor)
private
procedure SpecializedGetFile;
public
constructor Create;
end;

procedure TAncestor.GetFile;
begin
if Assigned(GetFileImpl) then
GetFileImpl
else begin
// Do default implementation instead
end;
end;

constructor TDescendant.Create;
begin
GetFileImpl := SpecializedGetFile;
end;

基类提供了一个方法指针,后代可以分配该方法指针以指示它们想要自己的特殊处理。如果后代为该属性提供了值,则基类的 GetFile 方法将使用它。否则,它将使用标准实现。定义 TGetFileImpl 以匹配 GetFile 的任何签名。

关于delphi - 如何强制后代类直接使用祖先方法或有一个不调用继承的新实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/290997/

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