从TObject派生时是否需要调用base方法?

时间:2013-04-19 11:48:06

标签: delphi inheritance

我有一个来自TObject的课程,如果我不调用父方法,那么它是不是很糟糕?我问,因为在查看TObject.Create / Destroy时,他们什么都不做。

这就是我们自己覆盖/揭露它们的原因。

没有代码示例,我只想确定。

3 个答案:

答案 0 :(得分:17)

最常见的行为是致电inherited。因此,如果我明确地不想要继承的行为,我不会调用inherited。否则,我做。如果继承的行为是{_ 1}}之类的无操作,我仍然会调用TObject.Create/Destroy

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

我知道有些作者在直接从inherited派生时会编写忽略inherited的代码,因为他们知道TObject中的实现什么都不做。我不喜欢这样,对我来说这样做是错误的。 TObject的实现细节不应泄漏到派生类中。

我很确定TObject永远都是无操作。如果Embarcadero改变了那么那么多代码就会破坏。但是你的课程呢?假设您有一个派生自TObject.Create/Destroy的类。然后你有另一个派生自那个的类:

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的调用,因为该调用什么都不做。

正常实例方法的情况略有不同。您希望忽略基类实现并提供全新的实现更合理。但是根据派生类想要做的决定而不是超类是否具有该方法的空实现来做出决定。

答案 1 :(得分:4)

如果您想要执行祖先的代码,您只需要调用inherited。你需要那些代码,有时你不需要。您也可以使用条件并仅在满足某些条件时调用inherited,并且您可以选择 时(方法的开头,方法的结尾,......)。

因此,这完全取决于具体情况。

Here's一个例子。

答案 2 :(得分:0)

尽管TObject的创建/销毁方法在当前版本中没有做任何事情,但它们可能在某个未来版本中(不太可能,但仍然可能)。那么现在对你来说是必须的吗?不,因为它不会完成任何事情,只是因为当前的父母没有添加任何功能。

如果您希望您的后代对象始终向其父母添加功能,那么始终呼叫inherited可能是个好主意。