2011-12-07 30 views

回答

4

这些方法的MSDN文档对此毫无用处。他们有一个“注意到实施者”的短语,要求你称之为基础方法。大多数基本方法实现都很干净,除了引发与方法相关的事件外,什么都不做。因此,如果您重写OnPaint,请执行所有绘画并且不调用base.OnPaint(),则不会引发Paint事件。哪一个工作得很好,但对另一个希望使用Paint事件的程序员来说可能是一个不愉快的惊喜,并且不知道他的代码为什么不起作用。

并非所有这些基本方法都很简单,但它们有时会做额外的工作。像OnFormClosing()一样调用ValidateChildren()。这可能很重要,否则你可能不会意外。控制的复杂性是一个因素。 DataGridView就是一个很好的例子,当你跳过基本的调用时,它不太可能工作。这种错误行为很难诊断。

冒这个险的意义不大,你没有时间机器来告诉你它不会造成麻烦。

这只是一个方面应该关注你,而不是在问题中另有问道。如果您首先调用基本方法,然后编写定制。或者你应该先定制,然后调用基本方法?这是这些方法存在的原因。这取决于你决定谁是老板。

0

基本方法本身会引发事件。

如果你不叫他们,任何正常的处理程序将永远不会运行。

+0

你说的'正常处理程序'究竟是什么? – Acidic

+1

将事件作为事件处理而不是覆盖的任何事情 - 例如,通过visual studio添加的应用程序中的其他代码,这些代码创建事件处理程序以对事件进行反应,而不是覆盖事件。 – BlueMonkMN

+0

但是没有默认的和/或看不见的行为会被不调用基方法打断或干扰? – Acidic

2

除了具体的答案之外,我还想指出,即使您知道(也许通过反编译)该方法什么也不做,总是调用已覆盖的基本方法通常是个好主意。原因是:API提供程序可能会在未来向该方法添加代码,这对于该类正常运行至关重要。这可以通过错误修复或新版本来完成。您无法知道提供程序是否会进行这些更改,以及何时/如果他们这样做,并且您的代码没有调用基本方法,那么在您的代码工作正常的情况下,您将遇到奇怪的问题。

我的规则是总是调用基本方法,除非我有一个非常明确的理由,我必须完全覆盖该基本方法的全部功能。