官术网_书友最值得收藏!

  • C# 8.0本質(zhì)論
  • (美)馬克·米凱利斯
  • 2109字
  • 2022-03-30 10:15:26

第6章 類

第1章簡單介紹了如何聲明一個名為HelloWorld的新類。第2章介紹了C#內(nèi)置的基元類型。學(xué)習(xí)了控制流程以及如何聲明方法之后,就可以學(xué)習(xí)如何定義自己的類型了。這是任何C#程序的核心構(gòu)造。正是由于C#支持類以及根據(jù)類來創(chuàng)建對象,所以我們說C#是一種面向?qū)ο蟮恼Z言。

本章介紹C#面向?qū)ο缶幊痰幕A(chǔ)知識。重點(diǎn)在于如何定義,可將類理解成對象的模板。

在面向?qū)ο缶幊讨?,之前學(xué)過的所有結(jié)構(gòu)化的、基于控制流的編程構(gòu)造仍然適用。但將那些構(gòu)造封裝在類中,可以創(chuàng)建更大、更有條理以及更容易維護(hù)的程序。從結(jié)構(gòu)化的、基于控制流程的程序轉(zhuǎn)向面向?qū)ο蟮某绦颍且驗槊嫦驅(qū)ο缶幊烫峁┝艘粋€額外的組織層次。結(jié)果是較小的程序在某種程度上得到了簡化。但更重要的是,現(xiàn)在更容易創(chuàng)建較大的程序,因為程序中的代碼得到了更好的組織。

面向?qū)ο缶幊痰囊粋€關(guān)鍵優(yōu)勢是不必從頭創(chuàng)建新程序,而是可以將現(xiàn)有的一系列對象組裝到一起,用新功能擴(kuò)展類,或添加更多的類。

還不熟悉面向?qū)ο缶幊痰淖x者應(yīng)閱讀“初學(xué)者主題”獲得對它的初步了解?!俺鯇W(xué)者主題”以外的內(nèi)容將著重討論如何使用C#進(jìn)行面向?qū)ο缶幊蹋⒓俣ㄗx者已熟悉了面向?qū)ο笏季S模式。

為支持封裝,C#必須支持類、屬性、訪問修飾符以及方法等構(gòu)造。本章著重討論前三種,方法已在第5章討論。掌握這些基礎(chǔ)知識之后,第7章將討論如何通過面向?qū)ο缶幊虒崿F(xiàn)繼承和多態(tài)性。

初學(xué)者主題:面向?qū)ο缶幊?OOP)

如今,成功編程的關(guān)鍵在于提供恰當(dāng)?shù)慕M織和結(jié)構(gòu),以滿足大型應(yīng)用程序的復(fù)雜需求。面向?qū)ο缶幊棠芎芎玫貙崿F(xiàn)該目標(biāo)。有多好呢?可以這樣說,開發(fā)者一旦熟悉了面向?qū)ο缶幊?,除非寫一些極為簡單的程序,否則很難回到結(jié)構(gòu)化編程。

面向?qū)ο缶幊套罨镜臉?gòu)造是類。一組類構(gòu)成了編程抽象、模型或模板,通常對應(yīng)現(xiàn)實世界的一個概念。例如,OpticalStorageMedia(光學(xué)存儲媒體)類可能有一個Eject()方法,用于從播放機(jī)彈出光盤。OpticalStorageMedia類是現(xiàn)實世界的CD/DVD播放機(jī)對象的編程抽象。

類是面向?qū)ο缶幊痰娜齻€主要特征——封裝、繼承和多態(tài)性——的基礎(chǔ)。

封裝

封裝旨在隱藏細(xì)節(jié)。必要的時候細(xì)節(jié)仍可訪問,但通過巧妙地封裝細(xì)節(jié),大的程序變得更容易理解,數(shù)據(jù)不會被不慎修改,代碼也變得更容易維護(hù)(因為對一處代碼進(jìn)行修改所造成的影響被限制在封裝的范圍之內(nèi))。方法就是封裝的一個例子。雖然可以將代碼從方法中拿出直接嵌入調(diào)用者的代碼中,但將特定的代碼重構(gòu)成方法,能享受到封裝所帶來的好處。

繼承

考慮這個例子:DVD是光學(xué)存儲媒體的一個類型。它具有特定的存儲容量,能容納一部數(shù)字電影。CD也是光學(xué)存儲媒體的一個類型,但它具有不同特征。CD上的版權(quán)保護(hù)有別于DVD的版權(quán)保護(hù),兩者存儲容量也不同。無論是CD還是DVD,它們都有別于硬盤、U盤和軟盤。雖然所有這些都是“存儲媒體”,但分別具有不同的特征——即使一些基本功能也是不同的,比如所支持的文件系統(tǒng),以及媒體的實例是只讀的還是可讀可寫的。

面向?qū)ο缶幊讨械睦^承允許在這些相似但又不同的物件之間建立“屬于”(is a)關(guān)系??珊侠淼卣J(rèn)為DVD和CD都“屬于”存儲媒體。因此它們都具有存儲能力。類似地,CD和DVD都“屬于”光學(xué)存儲媒體,后者又“屬于”存儲媒體。

為上面提到的每種存儲媒體類型都定義一個類,就得到一個類層次結(jié)構(gòu),它由一系列“屬于”關(guān)系構(gòu)成。例如,可將基類型(所有存儲媒體都從它派生)定義成StorageMedia(存儲媒體)。CD、DVD、硬盤、U盤和軟盤都屬于StorageMedia。但CD和DVD不必直接從StorageMedia派生。相反,可從中間類型OpticalStorageMedia(光學(xué)存儲媒體)派生??捎靡环鵘ML(Unified Modeling Language,統(tǒng)一建模語言)風(fēng)格的類關(guān)系圖來查看類層次結(jié)構(gòu),如圖6.1所示。

圖6.1 類層次結(jié)構(gòu)

繼承關(guān)系至少涉及兩個類,其中一個是另一個更具體的版本。圖6.1中的HardDrive是更具體的StorageMedia。反之不成立,因為StorageMedia的一個實例并非肯定是HardDrive。如圖6.1所示,繼承涉及的類可能不止兩個。

更具體的類型稱為派生類型子類型。更常規(guī)的類型稱為基類型或者超類型。也經(jīng)常將基類型稱為“父”類型,將派生類型稱為它的“子”類型。雖然這種說法很常見,但會帶來混淆?!白印碑吘共皇且环N“父”!本書將采用“派生類型”和“基類型”的說法。

為了從一個類型派生繼承,需對類型進(jìn)行特化,這意味著要對基類型進(jìn)行自定義,為滿足特定需求而調(diào)整它?;愋涂赡馨信缮愋投歼m用的實現(xiàn)細(xì)節(jié)。

繼承最關(guān)鍵的一點(diǎn)是所有派生類型都繼承了基類型的成員。派生類型中可以修改基類型的成員,但無論如何,派生類型除了自己顯式添加的成員,還包含了基類型的成員。

可用派生類型以一致性的層次結(jié)構(gòu)組織類。在這個層次結(jié)構(gòu)中,派生類型比它們的基類型更特別。

多態(tài)性

多態(tài)性這個詞由一個表示“多”(poly)的詞根和一個表示“態(tài)”(morph)的詞根構(gòu)成。講到對象時,多態(tài)性意味著一個方法或類型可具有多種形式的實現(xiàn)。假定有一個媒體播放機(jī),它既能播放音樂CD,也能播放包含MP3歌曲的DVD。但Play()方法的具體實現(xiàn)會隨著媒體類型的變化而變化。在一個音樂CD對象上調(diào)用Play()方法,或者在一張音樂DVD上調(diào)用Play()方法,都能播放出音樂,因為每種類型都理解自己具體如何“播放”。媒體播放機(jī)唯一知道的就是公共基類型OpticalStorageMedia以及它定義了Play()方法簽名的事實。多態(tài)性使不同類型能自己處理一個方法的實現(xiàn)細(xì)節(jié),因為多個派生類型都包含了該方法,每個派生類型都共享同一個基類型(或接口),后者也包含了相同的方法簽名。

主站蜘蛛池模板: 刚察县| 白银市| 黑水县| 万荣县| 陆河县| 腾冲县| 治多县| 伊宁市| 区。| 台北市| 盖州市| 十堰市| 吉安市| 临颍县| 西宁市| 黎城县| 米泉市| 思南县| 始兴县| 辽源市| 牡丹江市| 乌拉特中旗| 田东县| 清丰县| 三门峡市| 漳平市| 广西| 南澳县| 固阳县| 宁强县| 于田县| 湟中县| 宁海县| 白银市| 濮阳县| 稷山县| 无为县| 新乐市| 成武县| 万山特区| 浮梁县|