d語言類的繼承

參考自d程序設計語言---個人博客http://my.oschina.net/u/218155/blog?fromerr=SwOkb7Sw fllow meide

d語言支持繼承語法爲this

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的構造方法spa

子類要覆蓋父類的方法必須添加override關鍵字.net

final能夠修飾類,方法,和變量,被修飾的類,方法,變量禁止覆蓋設計

也支持子類向上轉型爲父類,可是不支持父類轉型爲子類code

d語言中全部的類都有共同的父類object對象

object自帶以下方法blog

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);
	
}
相關文章
相關標籤/搜索