On Friday, December 02, 2011 21:13:45 Adam wrote: > Anyway, I have my answer, and I know that D *does* have a reason for > this implicitism.
Okay. Maybe I've been skimming over this thread too much, but I don't understand what forcing the programmer to mark an abstract class as abstract would do. The compiler knows that the class is abstract regardless. It's going to generate an error when you try and instantiate that class - whether or not you mark the class as abstract or not has no impact on that as long as there are abstract functions (the sole bizareness being able to mark a class as abstract when none of its functions are abstract). It is perfectly legal and desirable to be able to have a class reference for an abstract class. e.g. abstract class C { abstract void func(); } class D : C { void func() { writeln("hello world"); } } C c = new D(); The compiler has nothing to complain about with a reference to an abstract class until you try and instatiate it. So, how does explicitly marking the class abstract help with that? I do think that it's a bit odd that D doesn't require that you mark classes as abstract if they have abstract functions and that it allows classes which don't have abstract functions to be marked abstract, but that should have no effect on whether the compiler can catch bugs related to abstract classes. The fact that the class has functions which are abstract is enough for the compiler to know that the class is abstract. new C() is what needs to be disallowed for abstract classes, and that is an instantiation. It's the instantations that need to be checked, and they _are_ checked. It is a compilation error when you try and instantiate an abstract class. The only thing that I see that marking the class abstract does is give the programmer a visual indicator that the class is abstract. I do think that that's valuable, and I'd love it if it were required when any functions in the class are abstract and disallowed when none are, but I don't see how it can have any effect on what errors you're getting. It's instatiating an abstract class which as error, not declaring one, and unless you actually instantiate it, there's no way for the compiler to catch it, because there's nothing to catch. - Jonathan M Davis