opEquals and the Non-Virtual Interface idiom
Jeremie Pelletier
jeremiep at gmail.com
Sun Sep 27 11:18:38 PDT 2009
grauzone wrote:
> Andrei Alexandrescu wrote:
>> Here's an article about the perils of equals in Java (opEquals in D):
>>
>> http://www.ddj.com/article/printableArticle.jhtml;jsessionid=GFKUCQH5S4IHNQE1GHOSKHWATMY32JVN?articleID=184405053&dept_url=/java/
>>
>>
>> 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. The implementation above ensures symmetry
>> of equality and has each class implement a simpler primitive.
>>
>> What do you think?
>
> Eh, now after all this discussion, we're going to allow even "this" to
> be null? That seems like a backstep...
How is it a backstep? It's perfectly valid behavior.
Object foo;
foo.opEquals(foo);
The call itself will *always* succeed, its when 'this' gets referenced
in opEquals that the code will crash.
> Implementing opEquals as a global/static function, that calls the actual
> Object.opEquals virtual method would be so much more straight forward.
I agree, I prefer methods to end with Impl to stay hidden instead of
being the ones to override.
> PS: I agree about the NVI thing. If you'd go to extend the language for
> "NVI", couldn't we just introduce a second type of virtual function that
> works this way:
> 1. the super class' implementation is _always_ called first
> 2. the super class function can decide to "call down" to the sub class'
> implementation of the same method
> => no extra do<something> method needed, and the code is (possibly)
> clearer.
>
>> Andrei
I don't know how useful that would be, when you override a method you
usually want to call the super method somewhere in the new
implementation, not always at the beginning.
More information about the Digitalmars-d
mailing list