抽象類與虛方法

2022-07-13 14:51:17 字數 1345 閱讀 3685

其實這是哲學的思維方式,所謂哲學就是建立事實基礎上,是人類對世界的思考和認識。

要理解抽象類就必須要有一定的程式設計經驗,就好像要理解哲學就需要有一定的生活經驗。跟乙個沒有大量程式設計經驗的人將設計模式那也是扯蛋!

所以作為乙個新手,特別是沒有物件導向程式設計經驗的來說,不理解抽象類是很正常的,等你有了一定的程式設計經驗,你自然而然就會理解了。

先看看msdn的關於抽象類和虛方法的解釋:

使用 abstract 關鍵字可以建立僅用於繼承用途的類和類成員,即定義派生的非抽象類的功能。

abstract 修飾符可以和類、方法、屬性、索引器及事件一起使用。在類宣告中使用 abstract 修飾符以指示某個類只能是其他類的基類。標記為抽象或包含在抽象類中的成員必須通過從抽象類派生的類來實現。

virtual 關鍵字用於修飾方法、屬性、索引器或事件宣告,並使它們可以在派生類中被重寫。例如,此方法可被任何繼承它的類重寫。

說說抽象類的理解吧:

既然是抽象類,那麼就是對事物的抽象描述,它描述的是個體的共性。那馬這種動物來說,我們所說的馬就是乙個抽象類。世界上存在很多種馬,白馬,黑馬,紅馬......如果沒有抽象的概念,我們就沒法獲得世界上所有馬,因為我們要說馬的時候,必須指定是哪種馬!但是我們其實是有抽象的概念的,我們定義了馬這樣的乙個概念,用來指代世界上所有的馬。但馬在這個世界上並不是真實存在的,你所能看見的馬一定是某一種型別的馬!

所以說,抽象類就是這樣一種類,描述了一種事物的共性,它不能例項化,只能通過它的子類例項化。

抽象方法:抽象方法一定是抽象類裡面的,抽象的方法沒有主體,就是沒有實現**,它的實現是由子類實現的。如果乙個抽象類裡面全是抽象方法的畫,那麼這個類和介面的功能基本就是一致,而抽象類和介面不一樣的地方就在於抽象類可以有非抽象的方法。

還是以馬類來說:

//乙個抽象的馬類

public abstract class 馬類

}public class 紅馬 : 馬類

}public class 白馬 : 馬類}}

說完了抽象,說說虛方法。

標記為虛方法的方法,可以在子類被重寫。也就說子類可以變異。還是馬類為例:

public abstract class 馬類

}public class 紅馬 : 馬類

//在這裡變異了,消化能力超強

public override void 消化()

}在這裡要說明一點是隱藏與重寫的區別。

重寫:繼承時發生,在子類中重新定義父類中的方法,子類中的方法和父類的方法是一樣的

隱藏:在派生類中使用new宣告乙個跟父類一樣的方法,那麼父類的方法將被隱藏起來,但是還是存在的,可以用base來呼叫。這樣相當於子類有兩套名稱一樣的方法。

虛方法,抽象類 ,介面

抽象類不能被例項化 只能宣告方法,不能實現,只能有他的 是乙個隱式的虛方法 抽象類裡的方法不能是私有的 如果抽象是私有的,那麼他的子類訪問不了它 在抽象方法中使用static和virtual修飾符是錯誤的 在靜態屬性中使用abstract是錯誤的 abstract方法只能在抽象類中宣告 而virtu...

虛函式與抽象類

抽象類不是實際存在的類,所以你不能定義乙個抽象類的物件,但是卻可以定義乙個指向抽象類的指標。抽象類僅僅起到了為派生類提供乙個介面的作用,這個介面類的純虛函式可以沒有任何作用,派生類將這些純虛函式繼承過來,然後給予不同的功能,而多型性又保證了使用者在輸入不同的數字時呼叫不同的虛函式。乙個虛函式通過初始...

抽象類與抽象方法

有些類注定是不能被初始化的,即不能被new 設想一下,乙個animal類下有很多子類,dog,cat,lion等,這些子類都可以被例項化,但是animal如果被例項化後會變成什麼樣?會有什麼特徵?這是難以想象的,因此像animal這樣的父類就不能例項化,我們迫切需要有一種類,只能例項化其子類物件而本...