On Wednesday, 16 September 2015 at 09:31:25 UTC, Jacob Carlborg wrote:
On 2015-09-16 10:49, FiveNights wrote:
Every so often I'll get a compiler error that isn't particularly clear on what's wrong and eventually I'll figure out that what's causing it is having a function in an abstract class somewhere that isn't defined:

abstract class SomeClass {
     int someVariable;
     void someFunction();
}
the solution is usually:
void someFunction(){}

Usually the abstract class is a converted interface, but it turned out that I needed to include a variable for it to work out and I just wasn't
keen on remembering to put a mixin in each derived class.

I'm just wondering why I can't have an undefined function in an abstract class? I'd the compiler to say, "Hey, you forgot to put 'someFunction()' in 'SomeDerrivedClass', go do something about that." when I end a function with a semi-colon in the base class and don't have it in the derrived. Everything just seems to break in cryptic ways unless I curly
brace the function ending.

I'm guessing you see a link error. The reason you see that instead of a compile error is because D supports separate compilation. Meaning that the method could be implemented in a different library that are resolved during link time.

As already answered in another post, the solution is to prefix the method declaration with "abstract".

Wouldn't the following behaviour be more useful as a default?

    abstract class Foo {
        void bar1() { }     // non-abstract, obviously
void bar2(); // abstract, because it's in an abstract class
                            // (different from now)
extern void bar3(); // non-abstract, but defined externally
    }

Reply via email to