On Tue, 30 Aug 2011 08:26:17 -0400, Andrei Alexandrescu <seewebsiteforem...@erdani.org> wrote:

On 08/30/2011 07:13 AM, Timon Gehr wrote:
If there already is an implementation, it overrides it, otherwise it
implements it.

That's pretty much it. The entire purpose of the "override" keyword is to prevent silent bugs of two kinds:

(a) User thinks she hooks a specific method but instead introduces a new one.

(b) User thinks she introduces a new method but instead hooks one.

Override helps only in cases where otherwise a silent error would occur. If the compiler issues an error message without the help of override, override is unneeded and illegal. This is the case with interface and abstract methods - "override" is emphatically unneeded because the compiler/linker wouldn't allow the code anyway.

Your (a) and (b) points seem to be pointing to a different conclusion -- that override should be required for interface methods. Since implementing an interface method does not introduce a new method, it hooks the interface's existing one.

I personally think override should be required if it overrides an existing implementation, be rejected if it introduces a completely new symbol, and be optional if it implements an abstract method. The latter rule is purely for code maintenance. 99%, no wait, I think 100% of the time, when a previously abstract base method grows an implementation after you have implemented it in a derived method, the remedy is simply adding override. This feels like annoyance that can be avoided by just putting override on it to begin with. I can't think of a single case where I've implemented a function I *know* is callable by some base class symbol that I'd want to be informed when a base class implements it later on. I don't care, I'm overriding it, no matter what the base class does (unless of course, the base class marks it final, but that would be an error anyways).

If the rule must be require or reject, I'd prefer requirement, even for interface methods.

-Steve

Reply via email to