On 8/24/11 12:27 PM, Ali Çehreli wrote:
On Wed, 24 Aug 2011 16:59:46 +0200, Andrej Mitrovic wrote:

class Foo
{
     this(int x, int y) { }
}

class Bar : Foo
{
}

Bar has to define its own ctor even if it only forwards the call to the
super() ctor, e.g.:

class Bar : Foo
{
     this(int x, int y) { super(x, y); }
}

That's because it is Bar that constructs its Foo part. The user
constructs a Bar and must provide only what Bar needs, potentially
nothing:

class Bar : Foo
{
     this() { super(42, 43); }

But I'm curious why this works this way.

Another reason would be function hijacking: Subtle changes in types of
contsructor parameters might bypass derived constructors just becaues
they now match better to the super's.

If I have a large inheritance
tree of classes and I want to change the base class ctor (say I want to
add another int as a parameter), I'll have to change all the ctors in
the subclasses as well.

Isn't that counterproductive?

Sounds like it but is necessary: Which of the constructors of the derived
constructors should the compiler call after calling super's matching one?
If it didn't, the derived parts would be left unconstructed.

Ali

I was against this feature but Ruby implements it and I love it. I see no technical reason not to do it. The rule should be: if the class doesn't provide any constructor, just copy the constructors from the base class.

Reply via email to