10

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

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

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

4

3 回答 3

17

最常见的行为是调用inherited. 因此,如果我明确不想要继承的行为,我不会调用inherited. 否则,我会。如果继承的行为是类似的无操作TObject.Create/Destroy,我仍然调用inherited.

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

我知道有些作者编写的代码inherited在直接从 派生时会省略TObject,因为他们知道其中的实现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因为那个调用什么都不做。

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

于 2013-04-19T11:53:06.913 回答
4

inherited如果您希望祖先的代码执行,您只需要调用。有时您需要该代码,有时您不需要。您也可以使用条件inherited语句,并且仅在满足某些条件时才调用,并且您可以选择何时执行(方法开始,方法结束,...)。

因此,这一切都取决于情况。

这是一个例子。

于 2013-04-19T11:49:46.593 回答
0

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

如果您希望您的后代对象始终向其父对象添加功能,那么始终调用inherited.

于 2013-04-19T17:42:05.540 回答