On Wed, 29 Jan 2014 08:30:53 -0500, Martin Cejp <[email protected]> wrote:

This is a feature I've always missed in C++. Consider the code
below:

import std.stdio;

interface Logger {
        void print(string msg);
}

class ConsoleLogger : Logger {
        static override void print(string msg) {
                writeln(msg);
        }
}

void main() {
        Logger logger = new ConsoleLogger;
        
        ConsoleLogger.print("Hello, World!");
}

Such definition of ConsoleLogger fails to compile. I don't see
any drawbacks to allowing this though, except the compiler would
probably have to generate 2 methods internally.
The way it is now, you have to either define each method twice or
always create an instance.
Or am I missing an obvious solution?

Interface Logger {
     final void print(string msg) { printImpl(msg); }
     void printImpl(string msg);
}

class ConsoleLogger : Logger {
     static void print(string msg) {
         writeln(msg);
     }

     override void printImpl(string msg) {
         print(msg);
     }
}

The issue you have is with the naming, you can't overload a virtual function with a static one. A static function call is a different call than a virtual one. You can't mix the two.

-Steve

Reply via email to