Interface file
Jan Johansson via Digitalmars-d
digitalmars-d at puremagic.com
Wed Sep 30 11:12:06 PDT 2015
On Wednesday, 30 September 2015 at 18:01:57 UTC, Adam D. Ruppe
wrote:
> On Wednesday, 30 September 2015 at 17:51:50 UTC, Jan Johansson
> wrote:
>> The interface file (I called it test.di):
>
> FYI there's no actual difference between .di files and .d
> files. The way D is meant to be used is you write the
> declarations together, then if you want to, you can
> automatically strip the bodies out of a .d file (dmd -H does
> it) and that makes the .di file.
>
>
> But you always substitute the .di file for the .d file with the
> same name. They cannot be used together like a .h and .cpp file.
>
>
> You can put an interface in a separate module than a class.
> Then you import the interface module from both locations,
> though your factory function won't work like that.
>
> Try something like:
>
> itest.d:
>
> module itest;
> interface IMyTest {
> void Write(string message);
> }
>
> test.d:
>
> public import itest; // import the interface definition too
> import std.stdio;
>
> private class MyTest : IMyTest {
> void Write(string message) {
> writeln(message);
> }
> }
>
> public IMyTest createInstance() {
> return new MyTest;
> }
>
>
>
> main.d:
>
> import test;
> import std.stdio;
>
> void main() {
> auto p = createInstance();
> p.Write("Hello, World!");
> }
>
>
>
> And that should work.
>
>> dmd test.d test.di -lib -oftest
>
> would be more like `dmd itest.d test.d -lib -oftest`
>
>> dmd main.d test.di test.a
>
> and `dmd main.d itest.d test.a`
>
>
>
> Or you could just compile it all at once with `dmd main.d
> test.d itest.d`
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.
Best regards
Jan Johansson
More information about the Digitalmars-d
mailing list