"The last feature": overridable methods in interfaces

Andrei Alexandrescu SeeWebsiteForEmail at erdani.org
Mon Feb 8 12:13:33 PST 2010


Steven Schveighoffer wrote:
> On Mon, 08 Feb 2010 14:36:37 -0500, Andrei Alexandrescu 
> <SeeWebsiteForEmail at erdani.org> wrote:
> 
>> Don wrote:
>>> Andrei Alexandrescu wrote:
>>>> Walter has now implemented final methods in interfaces and also 
>>>> contracts in interfaces, both of which I think are just awesome.
>>>>
>>>> We figured that essentially he artificially disallows interfaces 
>>>> from providing bodies for methods. I think that's a gratuitous 
>>>> limitation; the only distinguishing quality of an interface is that 
>>>> it has no state.  Other than that, interfaces can always offer 
>>>> overridable functions that by default offer functionality in terms 
>>>> of existing interface functions. For example:
>>>>
>>>> interface Stack(T)
>>>> {
>>>>     void push(T);
>>>>     void pop();
>>>>     @property ref T top();
>>>>     @property bool empty();
>>>>     T belowTop()
>>>>     {
>>>>         auto t = top;
>>>>         pop();
>>>>         auto result = top;
>>>>         push(t);
>>>>     }
>>>> }
>>>>
>>>> The default implementation of belowTop does a fair amount of work. A 
>>>> particular implementation might just use that or override it with a 
>>>> more efficient implementation.
>>>>
>>>> Many more examples can be imagined, but I'm looking for a killer 
>>>> one, or perhaps a killer counterexample (e.g. when would an 
>>>> interface-defined method be really bad?)
>>>>
>>>> Your thoughts welcome.
>>>>
>>>>
>>>> Andrei
>>>  I don't understand this. How does belowTop() know how to call top()?
>>
>> It calls top() through the normal interface mechanism. Inside 
>> belowTop(), this has Stack!T type.
> 
> Actually, I think Don has a point here.  A virtual function (even on an 
> interface) is always called with the 'this' pointer, not the interface 
> pointer.

That is done via an adjustment of the reference. In the case of an 
interface method, no adjustment is necessary. Inside the method, "this" 
has the static type of the interface and the dynamic type whichever 
class implements the interface.

Andrei



More information about the Digitalmars-d mailing list