Why do abstract class functions require definitions?
Marc Schütz via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Wed Sep 16 03:36:11 PDT 2015
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
}
More information about the Digitalmars-d-learn
mailing list