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也會在某些時候破壞封裝性,你應該知道是哪些時候.呵呵)