Thread overview
overriding private interface methods
Oct 23, 2012
Oleg
Oct 23, 2012
Ali Çehreli
Oct 23, 2012
Jonathan M Davis
October 23, 2012
Hello. How to override private methods?

import std.stdio, std.conv;

interface abcInterface
{
    private double private_func();
    public final double func() { return private_func(); }
}

class abcImpl: abcInterface
{
    override private double private_func() { return 3.14; } //#1
}

void main()
{
    auto abc = new abcImpl;
    writeln( abc.func() );
}

This code generate error
#1 Error: function inter.abcImpl.private_func cannot override a non-virtual function

This private method (private_func) is 'private' because it must call only in final interface methods (func)
October 23, 2012
On 10/23/2012 11:37 AM, Oleg wrote:
> Hello. How to override private methods?
>
> import std.stdio, std.conv;
>
> interface abcInterface
> {
> private double private_func();
> public final double func() { return private_func(); }
> }
>
> class abcImpl: abcInterface
> {
> override private double private_func() { return 3.14; } //#1
> }
>
> void main()
> {
> auto abc = new abcImpl;
> writeln( abc.func() );
> }
>
> This code generate error
> #1 Error: function inter.abcImpl.private_func cannot override a
> non-virtual function
>
> This private method (private_func) is 'private' because it must call
> only in final interface methods (func)

private member functions are not virtual by the design of the language. You have to make them 'protected', not private.

Ali
October 23, 2012
On Tuesday, October 23, 2012 11:47:09 Ali Çehreli wrote:
> private member functions are not virtual by the design of the language. You have to make them 'protected', not private.

Yes, but according to TDPL, it's different for interfaces. It specifically talks about using private with interfaces for NVI. And I don't believe that you can just swap it with protected in the case of interfaces (though I could be wrong - I don't remember for sure). Regardless, it doesn't currently work to use private like this for interfaces in spite of the fact that TDPL says that you can, and I'm not quite sure what's going to happen with that in the future. It's clear that private functions in classes will never be virtual, but I'm not sure that the situation is as clear with interfaces.

The relevant bug report:

http://d.puremagic.com/issues/show_bug.cgi?id=4542

- Jonathan M Davis