On 9/30/15 2:12 PM, Jan Johansson wrote:

Thanks,

But (there is always a but) ;-)

The main.d should rely on itest.d, not test.d, otherwise I do the
declaration for the library itself, but the main.d includes the test.d -
the implementation (not the declaration).

If I change the 'dmd main.d test.d test.a' to 'dmd main.d itest.d
test.a', then I got a new error: itest.d:(.text._Dmain+0x5): undefined
reference to `_D5itest14createInstanceFZC5itest7IMyTest'

The linker get confused about the separation of the declaration and
implementation.

There is no reason to use interfaces here, you can separate declaration from implementation without them:

test.di:

module test;
class MyTest {
   void Write(string message);
}

test.d:

module test;

class MyTest {
   void Write(string message) {
      writeln(message);
   }
}


main.d:

import test; // will work even if only test.di is available
import std.stdio;

void main() {
   auto p = new MyTest;
   p.Write("Hello, World!");
}

Interfaces are only necessary when you are unsure what concrete type you need until runtime.

-Steve

Reply via email to