Constructor inheritance & polish function

Kristian kjkilpi at gmail.com
Mon Aug 21 00:06:59 PDT 2006


Let there be classes Base and Derived. Base is the base class of Derived.

There are several constructors in Base. Derived can have constructors as  
follows:

1) Derived has only the default constructor which calls 'Base.this()' if  
it exists.
2) Derived uses the same constructor interface as Base. The constructors  
are not modified in any way (i.e. they simply call the ones in Base).
3) Derived uses the same constructor interface as Base. Some or all of the  
constructers are modified.
4) Derived uses different constructor interface as Base.

To my experience the commonness of the situations is: 2, 3, 4, and 1.


So constructors should be inherited from the base class. For example:

class Base {
     this() {...}
     this(int val) {...}

     void f() {...}
}

class Derived : Base {
     void f() {...}  //overrule a member function
}

void func() {
     Derived obj = new Derived(1);  //calls 'Base.this(int)' (now a compile  
time error)
}

It would make the case 2 breeze to implement!

If you define constructors for Derived, then the ones defined in Base  
should be hidden. The case 1 could be achieved by defining one  
constructor: 'this() {}'.


If there was a polish function (just like one in Qt) which is called after  
a constructor is finished, it would save unnecessary constructor writing  
in some cases. It would be especially useful when Derived is using the  
same constructor interface as Base (case 2) except the constructors should  
do something additional also (subtype of case 3). For example:

class Base {
     this() {
         m_val = -1;
         }
     this(int val) {
         m_val = val;
         }

     void f() {
         m_val = 100;
         }

     int m_val;
}

class Derived : Base {
     this_polish() {  //is called after a constructor
         f();
         }
}

void func() {
     Derived obj = new Derived(1);  //'obj.m_val' == 100 (first 1, then 100)
}


This would reduce redundant code, which is a possible source for typos and  
errors. It would also be easier to maintain: if parameter lists of Base's  
constructors are modified, no changes will be required for Derived.



More information about the Digitalmars-d-announce mailing list