自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

深入淺出談C#多態(tài)

開發(fā) 后端
本文將談?wù)凜#多態(tài),面向?qū)ο蟪绦蛟O(shè)計中的另外一個重要概念是多態(tài)性。希望本文對大家了解C#多態(tài)有所幫助。

一、什么是C#多態(tài)?

面向?qū)ο蟪绦蛟O(shè)計中的另外一個重要概念是多態(tài)性。在運行時,可以通過指向基類的指針,來調(diào)用實現(xiàn)派生類中的方法??梢园岩唤M對象放到一個數(shù)組中,然后調(diào)用它們的方法,在這種場合下,多態(tài)性作用就體現(xiàn)出來了,這些對象不必是相同類型的對象。當(dāng)然,如果它們都繼承自某個類,你可以把這些派生類,都放到一個數(shù)組中。如果這些對象都有同名方法,就可以調(diào)用每個對象的同名方法。

同一操作作用于不同的對象,可以有不同的解釋,產(chǎn)生不同的執(zhí)行結(jié)果,這就是多態(tài)性。多態(tài)性通過派生類重載基類中的虛函數(shù)型方法來實現(xiàn)。

在面向?qū)ο蟮南到y(tǒng)中,多態(tài)性是一個非常重要的概念,它允許客戶對一個對象進(jìn)行操作,由對象來完成一系列的動作,具體實現(xiàn)哪個動作、如何實現(xiàn)由系統(tǒng)負(fù)責(zé)解釋。

“多態(tài)性”一詞最早用于生物學(xué),指同一種族的生物體具有相同的特性。在C#中,多態(tài)性的定義是:同一操作作用于不同的類的實例,不同的類將進(jìn)行不同的解釋,***產(chǎn)生不同的執(zhí)行結(jié)果。C#支持兩種類型的多態(tài)性:

◆編譯時的多態(tài)性

編譯時的多態(tài)性是通過重載來實現(xiàn)的。對于非虛的成員來說,系統(tǒng)在編譯時,根據(jù)傳遞的參數(shù)、返回的類型等信息決定實現(xiàn)何種操作。

◆運行時的多態(tài)性

運行時的多態(tài)性就是指直到系統(tǒng)運行時,才根據(jù)實際情況決定實現(xiàn)何種操作。C#中,運行時的多態(tài)性通過虛成員實現(xiàn)。

編譯時的多態(tài)性為我們提供了運行速度快的特點,而運行時的多態(tài)性則帶來了高度靈活和抽象的特點。

二、實現(xiàn)C#多態(tài)

C#多態(tài)性是類為方法(這些方法以相同的名稱調(diào)用)提供不同實現(xiàn)方式的能力。多態(tài)性允許對類的某個方法進(jìn)行調(diào)用而無需考慮該方法所提供的特定實現(xiàn)。例如,可能有名為Road的類,它調(diào)用另一個類的Drive方法。這另一個類Car可能是SportsCar或SmallCar,但二者都提供Drive方法。雖然Drive方法的實現(xiàn)因類的不同而異,但Road類仍可以調(diào)用它,并且它提供的結(jié)果可由Road類使用和解釋。

可以用不同的方式實現(xiàn)組件中的多態(tài)性:

◆接口多態(tài)性。

◆繼承多態(tài)性。

◆通過抽象類實現(xiàn)的多態(tài)性。

接口多態(tài)性

多個類可實現(xiàn)相同的“接口”,而單個類可以實現(xiàn)一個或多個接口。接口本質(zhì)上是類需要如何響應(yīng)的定義。接口描述類需要實現(xiàn)的方法、屬性和事件,以及每個成員需要接收和返回的參數(shù)類型,但將這些成員的特定實現(xiàn)留給實現(xiàn)類去完成。

組件編程中的一項強(qiáng)大技術(shù)是能夠在一個對象上實現(xiàn)多個接口。每個接口由一小部分緊密聯(lián)系的方法、屬性和事件組成。通過實現(xiàn)接口,組件可以為要求該接口的任何其他組件提供功能,而無需考慮其中所包含的特定功能。這使后續(xù)組件的版本得以包含不同的功能而不會干擾核心功能。其他開發(fā)人員最常使用的組件功能自然是組件類本身的成員。然而,包含大量成員的組件使用起來可能比較困難。可以考慮將組件的某些功能分解出來,作為私下實現(xiàn)的單獨接口。

根據(jù)接口來定義功能的另一個好處是,可以通過定義和實現(xiàn)附加接口增量地將功能添加到組件中。優(yōu)點包括:

1.簡化了設(shè)計過程,因為組件開始時可以很小,具有最小功能;之后,組件繼續(xù)提供最小功能,同時不斷插入其他的功能,并通過實際使用那些功能來確定合適的功能。

2.簡化了兼容性的維護(hù),因為組件的新版本可以在添加新接口的同時繼續(xù)提供現(xiàn)有接口??蛻舳藨?yīng)用程序的后續(xù)版本可以利用這些接口的優(yōu)點。

通過繼承實現(xiàn)的多態(tài)性

多個類可以從單個基類“繼承”。通過繼承,類在基類所在的同一實現(xiàn)中接收基類的所有方法、屬性和事件。這樣,便可根據(jù)需要來實現(xiàn)附加成員,而且可以重寫基成員以提供不同的實現(xiàn)。請注意,繼承類也可以實現(xiàn)接口,這兩種技術(shù)不是互斥的。

C#通過繼承提供多態(tài)性。對于小規(guī)模開發(fā)任務(wù)而言,這是一個功能強(qiáng)大的機(jī)制,但對于大規(guī)模系統(tǒng),通常證明會存在問題。過分強(qiáng)調(diào)繼承驅(qū)動的多態(tài)性一般會導(dǎo)致資源大規(guī)模地從編碼轉(zhuǎn)移到設(shè)計,這對于縮短總的開發(fā)時間沒有任何幫助。

何時使用繼承驅(qū)動的多態(tài)性呢?使用繼承首先是為了向現(xiàn)有基類添加功能。若從經(jīng)過完全調(diào)試的基類框架開始,則程序員的工作效率將大大提高,方法可以增量地添加到基類而不中斷版本。當(dāng)應(yīng)用程序設(shè)計包含多個相關(guān)類,而對于某些通用函數(shù),這些相關(guān)類必須共享同樣的實現(xiàn)時,您也可能希望使用繼承。重疊功能可以在基類中實現(xiàn),應(yīng)用程序中使用的類可以從該基類中派生。抽象類合并繼承和實現(xiàn)的功能,這在需要二者之一的元素時可能很有用。

通過抽象類實現(xiàn)的多態(tài)性

抽象類同時提供繼承和接口的元素。抽象類本身不能實例化,它必須被繼承。該類的部分或全部成員可能未實現(xiàn),該實現(xiàn)由繼承類提供。已實現(xiàn)的成員仍可被重寫,并且繼承類仍可以實現(xiàn)附加接口或其他功能。

抽象類提供繼承和接口實現(xiàn)的功能。抽象類不能示例化,必須在繼承類中實現(xiàn)。它可以包含已實現(xiàn)的方法和屬性,但也可以包含未實現(xiàn)的過程,這些未實現(xiàn)過程必須在繼承類中實現(xiàn)。這使您得以在類的某些方法中提供不變級功能,同時為其他過程保持靈活性選項打開。抽象類的另一個好處是:當(dāng)要求組件的新版本時,可根據(jù)需要將附加方法添加到基類,但接口必須保持不變。

何時使用抽象類呢?當(dāng)需要一組相關(guān)組件來包含一組具有相同功能的方法,但同時要求在其他方法實現(xiàn)中具有靈活性時,可以使用抽象類。當(dāng)預(yù)料可能出現(xiàn)版本問題時,抽象類也具有價值,因為基類比較靈活并易于被修改。

【編輯推薦】

  1. C#中調(diào)用Windows API之托管對象
  2. C#進(jìn)度條的使用及開發(fā)淺析
  3. C#進(jìn)度條使用之多線程應(yīng)用淺析
  4. C#進(jìn)度條實現(xiàn)之異步實例淺析
  5. C#進(jìn)度條實現(xiàn)實例
責(zé)任編輯:彭凡 來源: host01.com
相關(guān)推薦

2022-01-11 07:52:22

CSS 技巧代碼重構(gòu)

2009-06-18 10:23:03

Javascript 基本框架

2011-07-04 10:39:57

Web

2021-03-16 08:54:35

AQSAbstractQueJava

2022-09-26 09:01:15

語言數(shù)據(jù)JavaScript

2017-07-02 18:04:53

塊加密算法AES算法

2019-01-07 15:29:07

HadoopYarn架構(gòu)調(diào)度器

2021-07-20 15:20:02

FlatBuffers阿里云Java

2012-05-21 10:06:26

FrameworkCocoa

2009-11-17 17:31:58

Oracle COMM

2021-07-19 11:54:15

MySQL優(yōu)先隊列

2023-12-04 13:22:00

JavaScript異步編程

2010-07-26 12:57:12

OPhone游戲開發(fā)

2016-10-14 13:53:05

JavascriptDOMWeb

2016-10-14 14:32:58

JavascriptDOMWeb

2010-07-16 09:11:40

JavaScript內(nèi)存泄漏

2024-01-09 12:05:24

SSH協(xié)議端口

2009-11-30 16:46:29

學(xué)習(xí)Linux

2019-11-11 14:51:19

Java數(shù)據(jù)結(jié)構(gòu)Properties

2019-12-04 10:13:58

Kubernetes存儲Docker
點贊
收藏

51CTO技術(shù)棧公眾號