[NAME]
ALL.dao.class.inheritance

[TITLE]
类的继承

[DESCRIPTION]

道语言里,新类可由已存在的类(或C数据类型)作为基类派生出来, 新类将作为该基类的子类继承基类
的一些数据和方法成员。 基类有时也被称作父类。

定义派生类时,基类的类名必须用冒号分割放在派生类名后面。 这里是个简单的例子: 
     
   1  class Base
   2  {
   3      var id = 0
   4  
   5      routine Base( i = 0 ){ id = i }
   6  }
   7  class Sub : Base
   8  {
   9      var value = 'abc'
  10  }
  11  var obj = Sub()
     
这个例子中,派生类的一个实例由该类的隐含的缺省构造方法产生。 该构造函数将自动调用基类的构造
方法(隐含的或显式定义的)以初始化基类的成员数据。

当显式定义派生类的构造方法时,基类的构造方法可被显式地调用。 这种调用方式跟C++里的类似,就是
用冒号分割,把基类构造方法的调用 放在派生类的构造方法的原型后面。 基类构造方法的调用可使用也
仅可使用派生类构造方法里的参数, 和自动定义的self变量。 
     
   1  class Sub : Base
   2  {
   3      var value = 'abc'
   4  
   5      routine Sub( v = 'ABC', i = 3 ) : Base( i ) { value = v }
   6  }
     


     
   1  load meta
   2  
   3  class Base
   4  {
   5      var id = 0
   6  
   7      routine VirtMeth(){ io.writeln( 'Base::VirtMeth()' ) }
   8      routine NormMeth(){
   9          meta.self( self ).VirtMeth() # emulate virtual method call;
  10      }
  11  }
  12  class Sub : Base
  13  {
  14      var value = 'abc'
  15      routine VirtMeth(){ io.writeln( 'Sub::VirtMeth()' ) }
  16  }
  17  o : Base = Sub()
  18  o.NormMeth() # prints: Sub::VirtMeth()