The Non-Virtual Interface idiom in D
Andrei Alexandrescu
SeeWebsiteForEmail at erdani.org
Fri Sep 25 21:48:25 PDT 2009
Rainer Deyke wrote:
> Andrei Alexandrescu wrote:
>> interface Cloneable(T) if (is(T == class))
>> {
>> private T doClone(); // must implement but can't call
>> T clone() // this is what everybody can call
>> {
>> auto result = doClone();
>> assert(typeof(result) == typeof(this));
>> assert(this.equals(result));
>> return result;
>> }
>> }
>
> This sounds like a case for contract inheritance rather than two layers
> of functions.
Contract inheritance has its place but NVI is more general than that.
>> interface ComparableForEquality(T)
>> {
>> protected bool doEquals(T);
>> final bool equals(T rhs)
>> {
>> auto result = doEquals(rhs);
>> assert(rhs.equals(cast(T) this) == result);
>> return result;
>> }
>> }
>
> This, on the other hand, does require two layers of functions if you
> want to remove the infinite recursion by replacing the 'equals' in the
> assertion with 'doEquals'.
Oops, yah, sorry about that. Replace rhs.equals with rhs.doEquals.
Access to doEquals was actually the point of the example.
Andrei
More information about the Digitalmars-d
mailing list