gpt4 book ai didi

delphi - 从TObject派生时是否需要调用基方法?

转载 作者:行者123 更新时间:2023-12-03 14:41:00 25 4
gpt4 key购买 nike

我有一个继承自TObject的类,如果我不调用父方法,是不是很糟糕?我问这个问题是因为在查看 TObject.Create/Destroy 时,它们什么也不做。

这就是我们自己覆盖/公开它们的原因。

没有代码示例,我只是想确认一下。

最佳答案

最常见的行为是调用inherited。因此,如果我明确不希望继承行为,我不会调用inherited。否则,我会的。如果继承的行为是像TObject.Create/Destroy这样的无操作,我仍然调用inherited

另请注意,构造函数和析构函数的情况可能与其他方法略有不同。您需要跳过对继承方法的调用的情况非常罕见。我想不出一个例子。构造函数总是会创建和销毁其他对象,所以你怎么能考虑跳过它呢?

我知道有些作者编写的代码在直接从 TObject 派生时省略了 inherited,因为他们知道 TObject 中的实现不执行任何操作。我不喜欢那样,对我来说这样做是错误的。 TObject 的实现细节不应泄漏到派生类中。

我非常确定TObject.Create/Destroy将始终是无操作的。如果 Embarcadero 改变了这一点,那么很多代码就会被破坏。但是你的一门课呢?假设您有一个从 TObject 派生的类。然后你有另一个派生自该类的类:

TMyClass1 = class
....
end;

TMyClass2 = class(TMyClass)
....
end;

您没有 TMyClass1 的构造函数,也没有 TMyClass2 的构造函数,如下所示:

constructor TMyClass2.Create;
begin
// no need to call inherited, it's a no-op
FMyObj := TBlahBlah.Create;
end;

然后有一天,您修改 TMyClass1 构造函数来执行某些操作。现在,TClass2 已损坏。因此,我永远不会省略对 inherited 的调用,因为该调用不会执行任何操作。

普通实例方法的情况有点不同。更有可能的是,您希望忽略基类实现并提供全新的实现。但要根据派生类想要做什么而不是父类(super class)是否有该方法的空实现来做出决定。

关于delphi - 从TObject派生时是否需要调用基方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16103916/

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