Making inheritance less tedious
    Kristian Kilpi 
    kjkilpi at gmail.com
       
    Mon Feb 26 05:31:29 PST 2007
    
    
  
I think class inheritance is a bit(?) tedious sometimes (that is,  
unnecessarily tedious).
(I leave interfaces out of this discussion.) 'Problems', IMHO, with it are:
1) You cannot inherit constructors.
2) A function will hide inherited functions having the same name.
3) The syntax for calling a super function of the base class is redundant  
and (could be) tedious.
For the case 2 there is an 'alias hack' (e.g. 'alias Base.foo foo;'), but  
it's redundant and ugly.
Recently this issue was discussed in the thread 'aliasing base methods'  
started by Frank Benoit
(http://www.digitalmars.com/webnews/newsgroups.php?art_group=digitalmars.D&article_id=49572),  
so I don't
talk about it here.
There should be some way to 'break' the case 1. For example, the following  
is laborious and error-prone:
   class CheckBox {
     this();
     this(string label);
     this(Icon icon, string label = null);
     void draw();
   }
   class MyCheckBox : CheckBox {
     this() {
       super();
     }
     this(string label) {
       super(label);
     }
     this(Icon icon, string label = null) {
       super(icon, label);
     }
     void draw();
   }
All I wanted was to reimplement the 'draw()' function. But I had to write  
all those redundant constructors also!
(Imagine if there were 20 or so constructors in the base class -- yes,  
it's possible in some situations.)
Surely there should be a simple solution for this?
For example, something like this:
   class MyCheckBox : CheckBox {
     inherit constructors;
     void draw();
   }
Or better yet:
   class MyCheckBox : inherit CheckBox {
     void draw();
   }
What about the case 3? Well, lets have the following member function:
   foo(int value, int x, int y, bool is_clipped, bool is_inverted, string  
label = null) {
     ...
     super.foo(value, x, y, is_clipped, is_inverted, label);
   }
It would be nice to have the following possible:
   foo(int value, int x, int y, bool is_clipped, bool is_inverted, string  
label = null) {
     ...
     superfunc(..);  //equals to 'super.foo(value, x, y, is_clipped,  
is_inverted, label);'
   }
'superfunc(..)' (or 'superfunc($)' or something) is non-redundant, easy to  
read, and
trivial to maintain (because no maintenance is needed! :) ).
You can of course define the arguments by yourself if needed:
   superfunc(value + 1, x, y, false, is_inverted);
    
    
More information about the Digitalmars-d
mailing list