抽象類
?抽象類:
?在程序中使用關(guān)鍵字abstract
?如果說正常類是一個完整類,抽象類實際上是一個不完整的類
?抽象類的特點
?1.如果類中存在抽象方法乞封,那么該方法不能有實現(xiàn)部分做裙,該方法只能有聲名
?2.含有抽象方法的類一定是抽象類
?3.抽象類不一定含有抽象方法
?4.如果子類的父類為抽象類并且含有抽象方法,子類必須重寫父類的抽象方法并且實現(xiàn)
?5.virtual和abstract 不能使用private修飾符肃晚,要使用public
?6.virtual不能和abstract放在一起
?7.抽象類不能被實例化锚贱。
?8.抽象類可以包含靜態(tài)成員
?抽象類的作用:父類約束子類行為。
從前有一個類关串,它有好幾個愿望拧廊,但是它很窮,它沒錢買晋修,機緣巧合之下它有了一個兒子卦绣,兒子很有錢,實現(xiàn)了它的愿望
abstract class Poor//抽象類
{
public abstract void fangzi();//定義抽象方法
public abstract void chezi();
}
class Son:Poor//繼承抽象類飞蚓,實現(xiàn)抽象類中的所有抽象方法
{
public override void fangzi(){//重寫父類抽象方法 關(guān)鍵字override
Console.WriteLine ("買了房子");
}
public override void chezi(){
Console.WriteLine ("買了車子");
}
虛方法和抽象方法
?虛方法和抽象方法都可以供派生類進行重寫滤港。
?1.虛方法必須有實現(xiàn)部分,并且為派生類提供了重寫該方法的選項趴拧。
?2.抽象方法沒有實現(xiàn)部分溅漾,并且抽象方法的派生是一種強制性的,繼承抽象類必須重寫實現(xiàn)抽象方法。這與virtual不同
?3.抽象方法只能在抽象類中進行聲明著榴,抽象方法必須在派生類重寫添履。含有抽象方法的必然是抽象類,也就是說必須強制聲明為abstract脑又,?系統(tǒng)不會自動為我們添加暮胧。
?4.抽象方法必須在派生類重寫,這一點和interface(接口)類似问麸,虛方法不必這樣往衷。
?虛方法和抽象類的聯(lián)系:
?1.無論是虛方法或者是抽象方法,重寫必須用override關(guān)鍵字
接口:接口就是公共契約
?接口的關(guān)鍵字:interface
?接口和類屬于同級關(guān)系严卖,都屬于C#中的編程單位席舍。
?接口也被叫做純潔的抽象類
?接口的特點
?1.接口不能包含字段
?2.接口內(nèi)不能有修飾符
?3.接口中不能有方法體
?4.接口同樣不能直接實例化
?5.接口里面成員總是公共的
?6.接口中可以有屬性,但是不能有修飾符
?7.接口中可以有索引器/事件申明
?8.接口中聲明的方法哮笆,子類實現(xiàn)的時候雖然也用override關(guān)鍵字来颤,但是記住不屬于重寫汰扭,這里不能把override顯示的聲明出來。
?開發(fā)準則:盡量多用接口
?能用接口的不用抽象類福铅,能用抽象類不用虛方法
interface IInterface1//接口1
{
void name();//默認的訪問修飾符是public
void hello();
}
interface IInterface2//接口2
{
void name();
void hi();
}
class A:IInterface1,IInterface2//A類繼承兩個接口
{
public void hello()//需要public關(guān)鍵字萝毛,不需要加override關(guān)鍵字
{
Console.WriteLine ("hello");
}
public void hi()
{
Console.WriteLine ("hi");
}
void IInterface1.name()//因為兩個接口中都有name方法所以需要用 ? 接口名.方法名 來重寫接口中的方法,并且不能使用public關(guān)鍵字
{
Console.WriteLine ("接口一的方法");
}
void IInterface2.name()//因為兩個接口中都有name方法所以需要用? 接口名.方法名 來重寫接口中的方法滑黔,并且不能使用public關(guān)鍵字
{
Console.WriteLine ("接口二的方法");
}
}
class MainClass
{
public static void Main (string[] args)
{
A a = new A ();
((IInterface1)a).name ();//在調(diào)用name方法的時候需要將a對象強制轉(zhuǎn)換成接口
((IInterface2)a).name ();//在調(diào)用name方法的時候需要將a對象強制轉(zhuǎn)換成接口
}
}