C#之抽象類和抽象方法
一、前言
在學習C#的時候經常會看到一個名詞“抽象類”,那什麼是抽象類,抽象類是用來幹什麼的,在看了很多部落格和資料,都說的很官方,理解起來很難,並且好多部落格資料都是不斷地抄襲抄襲,寫的千篇一律,基本都很相似,那下面小編就根據自己的理解說以下抽象來,結合抽象類把抽象方法也說了。
抽象方法:在類中沒有方法體的方法,就是抽象方法。
抽象類:含有抽象方法的類就叫抽象類。
二、抽象類
1、什麼是抽象類
抽象類中的方法既可以有抽象方法,也可以有非抽象方法,可以全部都是抽象方法,也可以全部都是非抽象方法
抽象方法只能出現在抽象類或介面中,不能出現在非抽象類中
抽象類和介面不能new物件
抽象類可以繼承抽象類,也可以繼承非抽象類
2.概念
籠統的,模糊,不具體的類
3.示例圖
為什麼說籠統的呢?從上圖可以看出來,圖中有個動物類,那動物類是一個很廣的範圍, 它只是一個概念,我們很難把動物這個類很具體的表現出來。所以它是一種籠統的,模糊,不具體的類。
4.個人理解
我們可以把抽象類看作是類的集合,把類看成是物件的集合,這樣一類我們對抽象類的理解就清晰多了。
那抽象類有什麼樣的特點呢?
方法只有宣告沒有實現,需要被abstract關鍵字修飾,抽象方法必須定義在抽象類中,該類也必須被abstract關鍵字修飾
抽象類不可以被例項化,因為呼叫抽象方法沒意義
抽象類必須有其子類覆蓋了所有的抽象方法後,才可以被例項化,否則這個子類還是是個抽象類
1.抽象方法只能定義在抽象類中,抽象的方法和抽象的類必須由關鍵字abstract修飾。
2.抽象類值只定義方法宣告,不定義功能主題(即方法的實現)。
3.抽象類不可以被建立物件。
抽象類就是一個不存在的東西,人們無法定義它,
抽象方法和抽象類又absctract修飾
5.性質:
a、抽象類只能用作其他類的基類,不能建立抽象類物件例項。
b、抽象類不能用作引數型別、函式返回型別、或顯示轉換的型別,
但可以宣告指向抽象類的指標變數、此指標可以指 向它的派生類,進而實現多型性
c、如果在抽象類的派生類中沒有重新說明純虛擬函式,則該函式在派生類中
仍然為純虛擬函式,而這個派生類仍然還是一個抽象類。
看看例項
//動物類程式碼
//動物類程式碼
public abstract class Animal
{
private string _name;
public string Name
{
get { return _name; }
set { _name = value; }
}
private char _gender;
public char Gender
{
get { return _gender; }
set { _gender = value; }
}
private int _age;
public int Age
{
get { return _age; }
set { _age = value; }
}
public abstract void Shout();
}
public class Pig : Animal
{
public override void Shout()
{
Console.WriteLine("哼哼叫");
}
}
//客戶端程式碼
static void Main(string[] args)
{
Pig pig = new Pig();
pig.Shout();
Console.ReadKey();
}
三、抽象方法
為什麼要用抽象方法,它有什麼好處?
抽象方法是一個模板或約束,避免了子類的隨意性,需要實現它的類必須重寫它的抽象那個方法。
舉個例子
就拿動物的抽象類來說,我們定義一個叫聲的方法,我們只知道有個方法,讓動物叫,可是動物多了,到底讓那個叫我們並不知道,它只是一個抽象的類,不具體,也沒有指明讓那個物件叫。這也就是說抽象方法為什麼沒有方法體了,如果有方法體我們就可以準確的知道那個動物叫了,它的叫聲什麼可以準確的形容出來了。要是我們想要準確的知道某個動物的叫聲是什麼就要重寫它。