This code compiles with no errors, and then later the linker gives a "Symbol Undefined":

abstract class A {
    public void foo();
}
class B : A {}
void main() {}


In this bug report I have asked for the compiler to give an error:
http://d.puremagic.com/issues/show_bug.cgi?id=5129


But Walter has answered it's not a bug:

This is not a bug, as in another module there could be a class C that derives
from B and implements foo().

As documented, D accepts non-abstract functions with no body declared as:

   void foo();

with the idea that the user will be supplying a body somewhere else - perhaps even a C function or an assembler one. It's another way of doing encapsulation by having an opaque implementation. In fact, it's used by the TypeInfo's.


Stewart Gordon suggests:

I think the underlying problem is that there's no mandatory explicit notation
for externally defined functions.


So isn't it better to require (similarly to annotations like "override") the programmer to write in B an "extern" or "abstract" or something similar to state that the implementation is elsewhere (and give a nice compilation error if it's missing)?


abstract class A {
    public void foo();
}
class B : A {
        extern foo;
}
void main() {}


Or:

abstract class A {
    public void foo();
}
class B : A {
        abstract foo;
}
void main() {}


Bye,
bearophile

Reply via email to