C# 多態理論基礎

來源:互聯網
上載者:User

標籤:anim   派生   執行個體化   err   2.2.3   構造   理論   法則   lan   

一、概述

 同一操作作用於不同的對象,可以有不同的解釋,產生不同的執行結果,這就是多態性。

 可以用不同的方式實現組件中的多態性: 

● 介面多態性。 
● 繼承多態性。 
● 通過抽象類別實現的多態性。

 

二、實現2.1、虛方法

定義:當類中的方法聲明前加上 virtual 修飾符,則稱之為虛方法。

作用:子類可以對父類中的虛方法進行重寫,虛方法是多態特性的一種體現。

即,用virtual關鍵字修飾父類方法,用 override 關鍵字修飾子類方法,實現了方法重寫。

特點:

a)、使用了virtual修飾符後不允許再有staticabstractoverride修飾符

b)、父類方法的存取層級和子類重寫方法的的存取層級必須相同,即它們應該具有相同的存取修飾詞

 

2.2、抽象類別和抽象方法

描述:如果一個類不與具體的事物相聯絡,而只是表達一種抽象的概念,僅僅是作為其衍生類別的一個基類,這樣的類就是抽象類別,在抽象類別中聲明方法時,如果加上abstract時就是抽象方法。

抽象類別是特殊的類,只是不能被執行個體化;除此以外,具有類的其他特性;重要的是抽象類別可以包括抽象方法,這是普通類所不能的。

抽象方法只能聲明於抽象類別中,且不包含任何實現,衍生類別必須覆蓋它們。另外,抽象類別可以派生自一個抽象類別,可以覆蓋基類的抽象方法也可以不覆蓋,如果不覆蓋,則其衍生類別必須覆蓋它們。

2.2.1、抽象類別的特點:

a)、抽象類別不能執行個體化(不能使用new 操作

b)、抽象類別可以包含抽象方法和抽象訪問器

c)、抽象類別不能是密封的或靜態(不能在抽象類別前加 static 或 sealed

d)、從抽象類別派生的非抽象類別必須實現繼承的所有抽象方法和抽象訪問器

e)、抽象類別是子類的描述,只有被子類繼承,才有實際意義

2.2.2、抽象類別對建構函式的限制:

a)、不要在抽象類別中定義公用的或受保護的內部建構函式(具有public或protected internal可見度的建構函式用於能進行執行個體化的類型,而任何情況下抽象類別型不能執行個體化)

b)、應在抽象類別中定義一個受保護的(protected)或私人的(private)建構函式

c)、如果在抽象類別中定義一個受保護的(protected)建構函式,則在建立衍生類別的執行個體時,基類可執行初始化。

 

2.2.3、抽象方法的特點:

定義:在抽象類別中,一個方法聲明如果加上 abstract 修飾符,則稱該方法為抽象方法

a)、抽象方法是隱式的虛方法。(抽象方法可以看作是沒有方法體的虛方法)

b)、只允許在抽象類別中使用抽象方法聲明

c)、因為抽象方法聲明不提供實際的實現,所有沒有方法體。(即:方法聲明只是以一個分號結束,並且在簽名後沒有大括弧{},實現由重寫方法提供,此重寫方法是非抽象類別的成員)

d)、在抽象方法聲明中不能使用 static virtual 修飾符

e)、除了在聲明和調用文法上不同外,抽象屬性的行為與抽象方法一樣

f)、不能在靜態屬性上使用 abstract 修飾符

g)、在衍生類別中,通過包括使用 override 修飾符的屬性聲明,可以重寫抽象的繼承屬性

 

[注]:

Animal a = new Dog;

a.Cry();

a.Show;

Animal:抽象類別,其中有一個抽象方法Cry(),一個具體方法Show()

Dog:繼承父類Animal,並使用 override 重寫抽象方法Cry(),並且有一個子類自己的具體方法ShowDog()

由此可得結論:

1、並沒有執行個體化抽象類別,只是聲明了一個抽象類別對象,執行個體化必須通過建構函式來實現,而這裡調用的是子類的建構函式,所以執行個體化的是子類對象,只是抽象對象引用了子類執行個體

2、抽象類別對象調用了子類的Cry()方法和本身的Show方法,子類的ShowDog()方法是不能被訪問的

3、抽象類別對象引用子類執行個體後,基本上還是屬於抽象類別,能夠訪問子類重寫的方法和父類自己的屬性和方法,子類自己的屬性和方法是不能訪問的。

 

2.3、介面

描述:

a)、在.NET中,介面是一種規範和標準,是純粹的協議。

b)、介面沒有提供預設的實現,由介面定義的某個特定成員依賴於它所類比的確切行為。介面表示某個類或結構可以選擇去實現的行為。

c)、從文法來說,介面使用 interface 關鍵字定義。和類不一樣的是,介面不指定基類,但介面可以指定基底介面。

d)、介面的成員不指定存取修飾詞(因為所有介面成員都是隱式公用的和抽象的)

e)、除非被類或介面實現,否則介面沒有作用。

f)、直接基類必須是冒號操作符後的第一個項。

g)、實現介面是一個“要麼全要,要麼全不要”的命題。

h)、當一個類繼承某個介面時,它不僅要實現該介面定義的所有方法,還要實現該介面從其他介面中繼承的所有方法。

i)、在C#中,一個類雖然不能實現多重繼承,但是一個類可以實現多個介面。

j)、介面是參考型別的,類似於類。

k)、 介面基本上不具備繼承的任何具體特點,它僅僅承諾了能夠調用的方法;

l)、 一個類一次可以實現若干個介面,但是只能擴充一個父類。

m)、好的介面定義應該是具有專一功能性的,而不是多功能的,否則造成介面汙染。如果一個類只是實現了這個介面的中一個功能,而不得不去實現介面中的其他方法,就叫介面汙染。

 

2.4、區別2.4.1、抽象方法和虛方法的區別:

  1>虛方法有實現部分,並為衍生類別提供了覆蓋該方法的選項,抽象方法則沒有提供實現部分,強制衍生類別覆蓋該方法

  2>abstract方法只能在抽象類別中聲明,virtual方法則不是

  3>abstract方法必須在衍生類別中重寫,virtual方法則不必

  4>abstract方法不能聲明方法體,virtual方法則可以

  5>包含abstract方法的類不能被執行個體化,而包含virtual方法的類則可以

 

2.4.2、介面和抽象類別的區別:

相同點:

1>都不能被直接執行個體化,都可以通過繼承實現其方法

2>包含未實現的方法聲明

不同點:

1>介面支援多重繼承;抽象類別不能實現多重繼承。

2>介面只能定義抽象規則,抽象類別既可以定義規則,還可以提供已實現的成員。

3>介面是一組行為規範;抽象類別是一個不完全的類。

4>介面可以用於支援回調;抽象類別不能實現回調,因為繼承不支援。

5>介面可以作用於實值型別和參考型別;抽象類別只能作用於參考型別。(例如,struct就可以繼承介面,而不能繼承類)

6>抽象類別實現的具體方法預設為虛的,但實現介面的類中的介面方法卻預設為非虛的,當然您也可以聲明為虛的。

7>抽象類別實現了oop中的一個原則,把可變的與不可變的分離。抽象類別和介面就是定義為不可變的,而把可變的作為子類去實現。

8>微軟的自訂介面總是後帶able欄位,證明其是表述一類類“我能做。。。”。抽象類別更多的是定義在一系列緊密相關的類間,而介面大多數是關係疏鬆但都實現某一功能的類中。     

9>(介面)與非抽象類別類似,抽象類別也必須為在該類的基類列表中列出的介面的所有成員提供它自己的實現。但是,允許抽象類別將介面方法映射到抽象方法上。
10>如果抽象類別實現介面,則可以把介面中方法映射到抽象類別中作為抽象方法而不必實現,而在抽象類別的子類中實現介面中方法。 

 


2.4.3、抽象類別和介面的使用:

1.如果預計會出現版本問題,可以建立“抽象類別”。

2.“介面不變”,是應該考慮的重要因素。所以,在由介面增加擴充時,應該增加新的介面,而不是更改現有介面。

3.抽象類別主要用於關係密切的對象;而介面適合為不相關的類提供通用功能。

4.介面多定義對象的行為;抽象類別多定義對象的屬性。

5.盡量將介面設計成功能單一的功能塊,以.NET Framework為例,IDisposable、IComparable等都只包含一個公用方法。

 

 

陌軒君 出處:http://www.cnblogs.com/yuan-jun/p/6413211.html本文著作權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文串連,否則保留追究法律責任的權利。

 

 

 

 

 

 

 

 

C# 多態理論基礎

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.