opEquals and the Non-Virtual Interface idiom

Andrei Alexandrescu SeeWebsiteForEmail at erdani.org
Mon Sep 28 14:32:34 PDT 2009


Justin Johansson wrote:
> Andrei Alexandrescu Wrote:
> 
>> It turns out this is a great example for NVI. In D, we could and should
>> do the following:
>>
>> class Object {
>>      // Implement this
>>      private bool opEqualsImpl(Object rhs) {
>>          return false;
>>      }
>>      // Use this
>>      final bool opEquals(Object rhs) {
>>          if (this is rhs) return true;
>>          if (this is null || rhs is null) return false;
>>          return opEqualsImpl(rhs) && rhs.opEqualsImpl(this);
>>      }
>> }
> 
> "I took advantage of the fact that in a final function this may be null without an access violation."
> 
> That "advantage" cannot be the general case?
> Surely that statement is only true when the final function is in a base class, X, (and X can only be Object in D, right?)
> for reason that the compiler can spot that the method is never overriden in ANY subclass of X (Object) , and therefore the method can be called directly rather than having to be dispatched through a VFT and consequently there is no VFT entry for that method/function.

Sorry, indeed I meant a "introducing final" function, not a final 
function. A final function that overrides one in the base class must 
often go through the vtable. Though if a final function (introducing or 
not) gets called for the static type that made it final, it needn't go 
through the vtable so a null this could be allowed inside of it.


Andrei



More information about the Digitalmars-d mailing list