参考自d程序设计语言---我的博客http://my.oschina.net/u/218155/blog?fromerr=SwOkb7Sw fllow me
d语言支持继承语法为
class A{
int a;
this(){writeln("A");}
this(int a){this.a = a;}
}
class B:A{
this(){writeln("B");}
this(int b){writeln("b is ",b);}
}
auto a = new B();//输出 A B
auto a = new B(11);//输出 A b is 11
子类B会自动调用父类A的构造方法
子类要覆盖父类的方法必须添加override关键字
final可以修饰类,方法,和变量,被修饰的类,方法,变量禁止覆盖
也支持子类向上转型为父类,但是不支持父类转型为子类
d语言中所有的类都有共同的父类object
object自带如下方法
toString toHash opEquals(Object ths)
opCmp(Object ths) static Object factory(string classname)
利用object创建对象
auto f4 = cast(A)Object.factory("test.A");
import std.stdio;
//final class Contract {
class Contract {
//final int data = 1;
int data;
static this(){
writeln("Contractoverride");
}
this(Contract source){
}
this() {
}
void dosomething(){
writeln("do some thing");
}
string getBgColor(){
return "black";
}
//final Contract dupli(){
Contract dupli(){
return new Contract(this);
}
}
class Friend :Contract {
static int count = 11;
int data = 3;
string mycolor = "white";
this(Friend source){
}
this() {
}
override string getBgColor(){
super.dosomething();
writeln(this.data+super.data);
return mycolor;
}
//override Contract dupli(){
override Friend dupli(){
return new Friend(this);
}
override bool opEquals(Object rhs){
auto cop = cast(Friend) rhs;
if(!cop) return false;
return data == cop.data && mycolor == cop.mycolor;
}
override int opCmp(Object rhs){
auto cop = cast(Friend) rhs;
if(!cop) return -1;
if(cop.data == data){
return 0;
}else if(cop.data > data){
return 1;
}else{
return -1;
}
}
}
unittest {
auto c = new Contract();
assert(c.getBgColor() == "black");
auto f = new Friend();
assert(f.getBgColor() == "white");
Contract c2 = new Friend();
assert(c2.getBgColor() == "white");
//Friend f2 = new Contract();//error
Contract c3 = c.dupli();
assert(c3.getBgColor() == "black");
Friend f2 = f.dupli();
assert(f2.getBgColor() == "white");
//static 可以从对象调用
//Object方法 toString toHash opEquals(Object ths)
//opCmp(Object ths) static Object factory(string classname)
assert(f2.count == 11);
assert(f2.toString() == "inheritance_list.Friend");
assert(f.opEquals(f2));
f2.data = 21;
assert(!f.opEquals(f2));
assert(f.toHash());
assert(f.opCmp(f) == 0);
assert(f2.opCmp(f) == -1);
auto f4 = cast(Friend)Object.factory("inheritance_list.Friend");
assert(f4.data == 3);
}