On Wednesday, 29 January 2014 at 13:39:24 UTC, Vladimir Panteleev wrote:
On Wednesday, 29 January 2014 at 13:30:54 UTC, Martin Cejp 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!");
}

I don't understand this code. You have a "logger" local variable, but don't use it. Do you want the compiler to autodetect which local variable to use by selecting one in the current scope?


Oh no, these are supposed to be 2 independent usage examples, 1) being able to pass an instance of ConsoleLogger to a function/class expecting Logger and 2) being able to call a method without any instance at all.

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?

What are you trying to accomplish?

You can use object instances as namespaces, too. Example:

/////////////////////////////////////////////////////////
import std.stdio;

interface Logger
{
        void print(string msg);
}

class ConsoleLoggerImpl : Logger
{
        override void print(string msg) const
        {
                writeln(msg);
        }
}

const ConsoleLogger = new ConsoleLoggerImpl;

void main()
{
        ConsoleLogger.print("Hello, World!");
}
/////////////////////////////////////////////////////////

Note that ConsoleLogger is "instantiated" at compile time, not runtime. To instantiate it at runtime, during initialization, you can use a static constructor.

At compile time? Wow. Well, I guess this might work for me then :) (though there's no way around having to use 2 different names for the class and the const instance, is there?)

Reply via email to