前言:在上一篇博文關於重寫的前提說明中提到了,那麼今天我們一起來看看抽象類以及抽象方法…,首先我們順着目錄從抽象類的介紹開始學習:
一.抽象類:
抽象類:往往用來表徵對問題領域進行分析、設計中得出的抽象概念,是對一系列看上去不同,但是本質上相同的具體概念的抽象,在面向對象的C#編程語言中,通常用abstract
來進行聲明它是一個抽象類;
1.聲明形式(創建抽象類):
訪問修飾符 abstract class abstract_name{}
舉例,我們創建一個父類,它擁有一個方法:
abstract class Father//抽象類關鍵字abstract
{
public void Run()
{
Console.WriteLine("我是抽象類我會跑,也會跳");
}
}
謹記:在抽象方法聲明中不能使用static
或virtual
修飾符!!!
原因請看圖:
2.抽象類的調用:
abstract class Father//抽象類關鍵字abstract
{
public void Run()
{
Console.WriteLine("我是抽象的父類我會跑,也會跳");
}
}
class Son:Father//繼承抽象類
{}
class Program
{
static void Main(string[] args)
{
Son son = new Son();
son.Run();
Console.ReadLine();
}
}
運行結果:
也許會有小夥伴會疑惑爲什麼不去實例化這個名爲"Father"的抽象類呢?下面我們來說說抽象類的規則:
二.抽象類的規則:
1. 不能創建一個抽象類的實例:
Father father = new Father();
如果我們這樣寫是錯誤的,爲什麼呢,來看看:
2. 不能在一個抽象類外部聲明一個抽象方法:
3.不能用sealed
關鍵字來修飾抽象類:
通過在類定義前面放置關鍵字 sealed
,可以將類聲明爲密封類。當一個類被聲明爲 sealed
時,它不能被繼承。抽象類不能被聲明爲 sealed
。不能用 sealed
修飾符修飾抽象類,因爲這兩個修飾符的含義是相反的。 採用 sealed
修飾符的類無法繼承,而 abstract
修飾符要求對類進行繼承:
4.抽象類中可以聲明正常函數:
三.抽象方法:
抽象方法只允許在抽象類中進行聲明!
舉例:
abstract class Father//抽象類關鍵字abstract
{
public abstract int Abb();//方法
}
在抽象類中進行聲明後,必須在子類的繼承中進行override
,否則就會報錯!!,同理屬性也是如此!!
四.應用舉例:
完整舉例代碼:
abstract class Father//抽象類關鍵字abstract
{
public void Run()
{
Console.WriteLine("我是抽象的父類我會跑,也會跳");
}
public abstract int Abb();//方法
public abstract int SS{ get; }//屬性
}
class Son :Father
{
public override int SS
{
get { return 1; }
}
public void Jump(int a)
{
Console.WriteLine("我是第{0}個子類",a);
}
public override int Abb()
{
Console.WriteLine("我是第{0}抽象方法",SS);
return (1);
}
}
class Program
{
static void Main(string[] args)
{
Son son = new Son();
son.Run();
son.Abb();
son.Jump(1);
Console.ReadLine();
}
}
運行結果:
五.抽象類的運用意義;
在面向對象方法中,抽象類主要用來進行類型隱藏。構造出一個固定的一組行爲的抽象描述,但是這組行爲卻能夠有任意個可能的具體實現方式。這個抽象描述就是抽象類,而這一組任意個可能的具體實現則表現爲所有可能的派生類;
六.總結:
1. 抽象類中的抽象屬性和抽象方法必須是公有的,因此必須有public
修飾符;
2. 子類必須override
抽象類中的所有抽象屬性和抽象方法,如果沒有全部override
,那麼子類必須是抽象類;
3. 抽象類中可以有非抽象屬性和非抽象方法,也可以是私有或者公有,但是如果是私有的話子類就不能訪問,無意義,所以一般情況下都設置爲公有public
訪問修飾符;
4. 有抽象方法或抽象屬性的類一定是抽象類,抽象類中的屬性或方法不一定都是抽象的;
5. 對抽象類不能使用new關鍵字,也不能被密封,原因是抽象類不能被實例化,不能被密封,因爲抽象類要求對類進行繼承;
6. 抽象類應主要用於關係密切的對象;
7.從抽象類派生的非抽象類必須包括繼承的所有抽象方法和抽象訪問器的實現;