天天看點

C# 基類和派生類

C#基類和派生類(轉)

1.基類和派生類的一些基本概念

class B : A{}

A是基類,B是派生類.

一個類最多隻允許從一個類中派生.

class C : B{}

B還可以充當C的派生類

繼承總是隐式為public的,System.Object是所有類的根

編譯器會把你的類悄悄的編譯成 class A : System.Object{}

2.調用基類的構造函數        

class B : A

{

public B(string sqlstr) : base(sqlstr)

{}

}

3基類派生類對象之間的關系

class A{}

class B : A {}

class C: A {}

B b = new B();

C c = b;  //這樣寫是錯誤地,因為類型不同

A a = b; //這樣寫是正确的,但是一定要注意:

這樣做有一個明顯的限制 a 對象隻能通路基類中的成員不能通路派生類中的成員

這就是為什麼C#完全面向對象的原因,因為C#中所有的東西都繼承自System.Object,任何東西都能賦給一個object變量

4.方法的隐藏

如果一個基類有n個方法和n個派生類,這n個派生類裡又分别有n個方法.你想過會出現什麼問題嗎?對!就是會遇到完全一樣簽名的方法(方法名\參數的數量\類型完全一樣)如果出現這樣的情況,在編譯過程中将收到一個警告,不要驚慌,僅僅是警告而已,不會影響編譯的過程.

但是你應該認真的對待這個警告,如果派生類的一個對象将調用基類的一個方法,然而這個方法又在這個派生類裡有相同簽名的方法!那編譯器該怎麼辦?

我可以負責任的告訴你(呵呵):

對象調用的是派生類裡的方法,

這種現象在微軟官方叫方法的隐藏,

如果你不想看到那個警告,可以在派生類中與基類同簽名的方法前面加個new關鍵字,告訴編譯器:我會為我造成的結果負責,不要警告我!注意這個關鍵字隻是起個屏蔽警告的作用,你明白我的意思嗎?(派生類的對象照樣還是不能調用基類中同簽名的方法,呵呵,還是再補一句吧,)

5.方法的覆寫

先看個例子:

class nvren

{

public virtual string leixing()

{return "這是個女人";}

}

class meinv : nvren

{

public override string leixing()

{return "這是個美女";}

}

class weizhi : nvren

{

...............//這裡并沒有任何覆寫原方法的方法

}

nvren a = new nvren();

meinv b = new meinv();

weizhi c = new weizhi();

Console.WriteLine(a.leixing());

Console.WriteLine(b.leixing());

Console.WriteLine(c.leixing());

程式很簡單(原諒我用了中文拼音,我知道你看了很多國外的程式,肯定膩了)

當調用第三個WriteLine時,程式輸出了"這是個女人",現在不用我解釋你也該明白了.

這種同一個語句調用不同方法的現象稱為多态性(面向對象的一大特性啊!)

使用virtul和override一定要注意:

(1)兩個方法必簽名相同!

(2)兩個方法均不能是private方法,且必須有相同的可通路性!

(3)不要試圖override沒有virtual的方法!

(4)不要試圖不用override就覆寫基類的virtual方法(那就成了方法的隐藏了)!

在給你個小竅門:

一個override方法将隐式的成為virtual方法,他本身可在未來的一個派生類裡被覆寫(點到為止,不要讓我寫例子給你)

這篇小文到次也該結束了,但我還想再提兩句

1.派生類可以通路一個基類的protected成員

2.建議保持字段為private. ( 因為面向對象強調封裝,而public破壞了封裝性,private也會在某些時候破壞封裝性,你應該知道是哪些時候.呵呵)