面向接口編程詳解思想基礎(chǔ)_第1頁(yè)
面向接口編程詳解思想基礎(chǔ)_第2頁(yè)
面向接口編程詳解思想基礎(chǔ)_第3頁(yè)
面向接口編程詳解思想基礎(chǔ)_第4頁(yè)
面向接口編程詳解思想基礎(chǔ)_第5頁(yè)
已閱讀5頁(yè),還剩8頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、對(duì)于各位使用面向?qū)ο缶幊陶Z(yǔ)言的程序員來(lái)說(shuō),“接口”這個(gè)名詞一定不陌生,但是不知各位有沒(méi)有這樣的疑惑:接口有什么用途?它和抽象類有什么區(qū)別?能不能用抽象類代替接口呢?而且,作為程序員,一定經(jīng)常聽到“面向接口編程”這個(gè)短語(yǔ),那么它是什么意思?有什么思想內(nèi)涵?和面向?qū)ο缶幊淌鞘裁搓P(guān)系? 1.面向接口編程和面向?qū)ο缶幊淌鞘裁搓P(guān)系      首先,面向接口編程和面向?qū)ο缶幊滩⒉皇瞧郊?jí)的,它并不是比面向?qū)ο缶幊谈冗M(jìn)的一種獨(dú)立的編程思想,而是附屬于面向?qū)ο笏枷塍w系,屬于其一部分?;蛘哒f(shuō),它是面向?qū)ο缶幊腆w系中的思想精髓之一。2.接口的本質(zhì) 

2、60;    接口,在表面上是由幾個(gè)沒(méi)有主體代碼的方法定義組成的集合體,有唯一的名稱,可以被類或其他接口所實(shí)現(xiàn)(或者也可以說(shuō)繼承)。它在形式上可能是如下的樣子:interface InterfaceName    void Method1();    void Method2(int para1);    void Method3(string para2,string par

3、a3);      那么,接口的本質(zhì)是什么呢?或者說(shuō)接口存在的意義是什么。我認(rèn)為可以從以下兩個(gè)視角考慮:      1)接口是一組規(guī)則的集合,它規(guī)定了實(shí)現(xiàn)本接口的類或接口必須擁有的一組規(guī)則。體現(xiàn)了自然界“如果你是則必須能”的理念。      例如,在自然界中,人都能吃飯,即“如果你是人,則必須能吃飯”。那么模擬到計(jì)算機(jī)程序中,就應(yīng)該有一個(gè)IPerson(習(xí)慣上,接口名由“I”開頭)接口,并有一個(gè)方法叫Eat(),然后我們規(guī)定,每一個(gè)表示

4、“人”的類,必須實(shí)現(xiàn)IPerson接口,這就模擬了自然界“如果你是人,則必須能吃飯”這條規(guī)則。      從這里,我想各位也能看到些許面向?qū)ο笏枷氲臇|西。面向?qū)ο笏枷氲暮诵闹?,就是模擬真實(shí)世界,把真實(shí)世界中的事物抽象成類,整個(gè)程序靠各個(gè)類的實(shí)例互相通信、互相協(xié)作完成系統(tǒng)功能,這非常符合真實(shí)世界的運(yùn)行狀況,也是面向?qū)ο笏枷氲木琛?#160;     2)接口是在一定粒度視圖上同類事物的抽象表示。注意這里我強(qiáng)調(diào)了在一定粒度視圖上,因?yàn)椤巴愂挛铩边@個(gè)概念是相對(duì)的,它因?yàn)榱6纫晥D不同而不同。 &#

5、160;    例如,在我的眼里,我是一個(gè)人,和一頭豬有本質(zhì)區(qū)別,我可以接受我和我同學(xué)是同類這個(gè)說(shuō)法,但絕不能接受我和一頭豬是同類。但是,如果在一個(gè)動(dòng)物學(xué)家眼里,我和豬應(yīng)該是同類,因?yàn)槲覀兌际莿?dòng)物,他可以認(rèn)為“人”和“豬”都實(shí)現(xiàn)了IAnimal這個(gè)接口,而他在研究動(dòng)物行為時(shí),不會(huì)把我和豬分開對(duì)待,而會(huì)從“動(dòng)物”這個(gè)較大的粒度上研究,但他會(huì)認(rèn)為我和一棵樹有本質(zhì)區(qū)別。      現(xiàn)在換了一個(gè)遺傳學(xué)家,情況又不同了,因?yàn)樯锒寄苓z傳,所以在他眼里,我不僅和豬沒(méi)區(qū)別,和一只蚊子、一個(gè)細(xì)菌、一顆樹、一個(gè)蘑菇乃至一個(gè)

6、SARS病毒都沒(méi)什么區(qū)別,因?yàn)樗麜?huì)認(rèn)為我們都實(shí)現(xiàn)了IDescendable這個(gè)接口(注:descend vi. 遺傳),即我們都是可遺傳的東西,他不會(huì)分別研究我們,而會(huì)將所有生物作為同類進(jìn)行研究,在他眼里沒(méi)有人和病毒之分,只有可遺傳的物質(zhì)和不可遺傳的物質(zhì)。但至少,我和一塊石頭還是有區(qū)別的。      可不幸的事情發(fā)生了,某日,地球上出現(xiàn)了一位偉大的人,他叫列寧,他在熟讀馬克思、恩格斯的辯證唯物主義思想巨著后,頗有心得,于是他下了一個(gè)著名的定義:所謂物質(zhì),就是能被意識(shí)所反映的客觀實(shí)在。至此,我和一塊石頭、一絲空氣、一條成語(yǔ)和傳輸手機(jī)信號(hào)

7、的電磁場(chǎng)已經(jīng)沒(méi)什么區(qū)別了,因?yàn)樵诹袑幍难劾?,我們都是可以被意識(shí)所反映的客觀實(shí)在。如果列寧是一名程序員,他會(huì)這么說(shuō):所謂物質(zhì),就是所有同時(shí)實(shí)現(xiàn)了“IReflectabe”和“IEsse”兩個(gè)接口的類所生成的實(shí)例。(注:reflect v. 反映  esse n. 客觀實(shí)在)      也許你會(huì)覺(jué)得我上面的例子像在瞎掰,但是,這正是接口得以存在的意義。面向?qū)ο笏枷牒秃诵闹唤凶龆鄳B(tài)性,什么叫多態(tài)性?說(shuō)白了就是在某個(gè)粒度視圖層面上對(duì)同類事物不加區(qū)別的對(duì)待而統(tǒng)一處理。而之所以敢這樣做,就是因?yàn)橛薪涌诘拇嬖凇O衲莻€(gè)遺傳學(xué)家,他明白所有生物都實(shí)現(xiàn)

8、了IDescendable接口,那只要是生物,一定有Descend()這個(gè)方法,于是他就可以統(tǒng)一研究,而不至于分別研究每一種生物而最終累死。      可能這里還不能給你一個(gè)關(guān)于接口本質(zhì)和作用的直觀印象。那么在后文的例子和對(duì)幾個(gè)設(shè)計(jì)模式的解析中,你將會(huì)更直觀體驗(yàn)到接口的內(nèi)涵。3.面向接口編程綜述      通過(guò)上文,我想大家對(duì)接口和接口的思想內(nèi)涵有了一個(gè)了解,那么什么是面向接口編程呢?我個(gè)人的定義是:在系統(tǒng)分析和架構(gòu)中,分清層次和依賴關(guān)系,每個(gè)層次不是直接向其上層提供服務(wù)(即不是直接實(shí)例化在上層

9、中),而是通過(guò)定義一組接口,僅向上層暴露其接口功能,上層對(duì)于下層僅僅是接口依賴,而不依賴具體類。      這樣做的好處是顯而易見(jiàn)的,首先對(duì)系統(tǒng)靈活性大有好處。當(dāng)下層需要改變時(shí),只要接口及接口功能不變,則上層不用做任何修改。甚至可以在不改動(dòng)上層代碼時(shí)將下層整個(gè)替換掉,就像我們將一個(gè)WD的60G硬盤換成一個(gè)希捷的160G的硬盤,計(jì)算機(jī)其他地方不用做任何改動(dòng),而是把原硬盤拔下來(lái)、新硬盤插上就行了,因?yàn)橛?jì)算機(jī)其他部分不依賴具體硬盤,而只依賴一個(gè)IDE接口,只要硬盤實(shí)現(xiàn)了這個(gè)接口,就可以替換上去。從這里看,程序中的接口和現(xiàn)實(shí)中的接口極為相似,所以我一直

10、認(rèn)為,接口(interface)這個(gè)詞用的真是神似!      使用接口的另一個(gè)好處就是不同部件或?qū)哟蔚拈_發(fā)人員可以并行開工,就像造硬盤的不用等造CPU的,也不用等造顯示器的,只要接口一致,設(shè)計(jì)合理,完全可以并行進(jìn)行開發(fā),從而提高效率。面向?qū)ο蟮木枋悄M現(xiàn)實(shí),這也可以說(shuō)是我這篇文章的靈魂。所以,多從現(xiàn)實(shí)中思考面向?qū)ο蟮臇|西,對(duì)提高系統(tǒng)分析設(shè)計(jì)能力大有脾益。問(wèn)題的提出         定義:現(xiàn)在我們要開發(fā)一個(gè)應(yīng)用,模擬移動(dòng)存儲(chǔ)設(shè)備的讀寫,即計(jì)算機(jī)與U盤、MP3、移動(dòng)

11、硬盤等設(shè)備進(jìn)行數(shù)據(jù)交換。      上下文(環(huán)境):已知要實(shí)現(xiàn)U盤、MP3播放器、移動(dòng)硬盤三種移動(dòng)存儲(chǔ)設(shè)備,要求計(jì)算機(jī)能同這三種設(shè)備進(jìn)行數(shù)據(jù)交換,并且以后可能會(huì)有新的第三方的移動(dòng)存儲(chǔ)設(shè)備,所以計(jì)算機(jī)必須有擴(kuò)展性,能與目前未知而以后可能會(huì)出現(xiàn)的存儲(chǔ)設(shè)備進(jìn)行數(shù)據(jù)交換。      各個(gè)存儲(chǔ)設(shè)備間讀、寫的實(shí)現(xiàn)方法不同,U盤和移動(dòng)硬盤只有這兩個(gè)方法,MP3Player還有一個(gè)PlayMusic方法。      名詞定義:數(shù)據(jù)交換=讀,寫 

12、0;    看到上面的問(wèn)題,我想各位腦子中一定有了不少想法,這是個(gè)很好解決的問(wèn)題,很多方案都能達(dá)到效果。下面,我列舉幾個(gè)典型的方案。解決方案列舉      方案一:分別定義FlashDisk、MP3Player、MobileHardDisk三個(gè)類,實(shí)現(xiàn)各自的Read和Write方法。然后在Computer類中實(shí)例化上述三個(gè)類,為每個(gè)類分別寫讀、寫方法。例如,為FlashDisk寫ReadFromFlashDisk、WriteToFlashDisk兩個(gè)方法??偣擦鶄€(gè)方法。    

13、;  方案二:定義抽象類MobileStorage,在里面寫虛方法Read和Write,三個(gè)存儲(chǔ)設(shè)備繼承此抽象類,并重寫Read和Write方法。Computer類中包含一個(gè)類型為MobileStorage的成員變量,并為其編寫get/set器,這樣Computer中只需要兩個(gè)方法:ReadData和WriteData,并通過(guò)多態(tài)性實(shí)現(xiàn)不同移動(dòng)設(shè)備的讀寫。      方案三:與方案二基本相同,只是不定義抽象類,而是定義接口IMobileStorage,移動(dòng)存儲(chǔ)器類實(shí)現(xiàn)此接口。Computer中通過(guò)依賴接口IMobileStorage實(shí)

14、現(xiàn)多態(tài)性。      方案四:定義接口IReadable和IWritable,兩個(gè)接口分別只包含Read和Write,然后定義接口IMobileStorage接口繼承自IReadable和IWritable,剩下的實(shí)現(xiàn)與方案三相同。      下面,我們來(lái)分析一下以上四種方案:      首先,方案一最直白,實(shí)現(xiàn)起來(lái)最簡(jiǎn)單,但是它有一個(gè)致命的弱點(diǎn):可擴(kuò)展性差?;蛘哒f(shuō),不符合“開放-關(guān)閉原則”(注:意為對(duì)擴(kuò)展開放,對(duì)修改關(guān)閉)。當(dāng)將來(lái)有了第三方擴(kuò)展

15、移動(dòng)存儲(chǔ)設(shè)備時(shí),必須對(duì)Computer進(jìn)行修改。這就如在一個(gè)真實(shí)的計(jì)算機(jī)上,為每一種移動(dòng)存儲(chǔ)設(shè)備實(shí)現(xiàn)一個(gè)不同的插口、并分別有各自的驅(qū)動(dòng)程序。當(dāng)有了一種新的移動(dòng)存儲(chǔ)設(shè)備后,我們就要將計(jì)算機(jī)大卸八塊,然后增加一個(gè)新的插口,在編寫一套針對(duì)此新設(shè)備的驅(qū)動(dòng)程序。這種設(shè)計(jì)顯然不可取。      此方案的另一個(gè)缺點(diǎn)在于,冗余代碼多。如果有100種移動(dòng)存儲(chǔ),那我們的Computer中豈不是要至少寫200個(gè)方法,這是不能接受的!      我們?cè)賮?lái)看方案二和方案三,之所以將這兩個(gè)方案放在一起討論,是因?yàn)樗麄兓臼?/p>

16、一個(gè)方案(從思想層面上來(lái)說(shuō)),只不過(guò)實(shí)現(xiàn)手段不同,一個(gè)是使用了抽象類,一個(gè)是使用了接口,而且最終達(dá)到的目的應(yīng)該是一樣的。      我們先來(lái)評(píng)價(jià)這種方案:首先它解決了代碼冗余的問(wèn)題,因?yàn)榭梢詣?dòng)態(tài)替換移動(dòng)設(shè)備,并且都實(shí)現(xiàn)了共同的接口,所以不管有多少種移動(dòng)設(shè)備,只要一個(gè)Read方法和一個(gè)Write方法,多態(tài)性就幫我們解決問(wèn)題了。而對(duì)第一個(gè)問(wèn)題,由于可以運(yùn)行時(shí)動(dòng)態(tài)替換,而不必將移動(dòng)存儲(chǔ)類硬編碼在Computer中,所以有了新的第三方設(shè)備,完全可以替換進(jìn)去運(yùn)行。這就是所謂的“依賴接口,而不是依賴與具體類”,不信你看看,Computer類只有一個(gè)Mobi

17、leStorage類型或IMobileStorage類型的成員變量,至于這個(gè)變量具體是什么類型,它并不知道,這取決于我們?cè)谶\(yùn)行時(shí)給這個(gè)變量的賦值。如此一來(lái),Computer和移動(dòng)存儲(chǔ)器類的耦合度大大下降。      那么這里該選抽象類還是接口呢?還記得第一篇文章我對(duì)抽象類和接口選擇的建議嗎?看動(dòng)機(jī)。這里,我們的動(dòng)機(jī)顯然是實(shí)現(xiàn)多態(tài)性而不是為了代碼復(fù)用,所以當(dāng)然要用接口。      最后我們?cè)賮?lái)看一看方案四,它和方案三很類似,只是將“可讀”和“可寫”兩個(gè)規(guī)則分別抽象成了接口,然后讓IMobileSt

18、orage再繼承它們。這樣做,顯然進(jìn)一步提高了靈活性,但是,這有沒(méi)有設(shè)計(jì)過(guò)度的嫌疑呢?我的觀點(diǎn)是:這要看具體情況。如果我們的應(yīng)用中可能會(huì)出現(xiàn)一些類,這些類只實(shí)現(xiàn)讀方法或只實(shí)現(xiàn)寫方法,如只讀光盤,那么這樣做也是可以的。如果我們知道以后出現(xiàn)的東西都是能讀又能寫的,那這兩個(gè)接口就沒(méi)有必要了。其實(shí)如果將只讀設(shè)備的Write方法留空或拋出異常,也可以不要這兩個(gè)接口??傊痪湓挘豪碚撌撬赖?,人是活的,一切從現(xiàn)實(shí)需要來(lái),防止設(shè)計(jì)不足,也要防止設(shè)計(jì)過(guò)度。      在這里,我們姑且認(rèn)為以后的移動(dòng)存儲(chǔ)都是能讀又能寫的,所以我們選方案三。實(shí)現(xiàn)  

19、;    下面,我們要將解決方案加以實(shí)現(xiàn)。我選擇的語(yǔ)言是C#,但是在代碼中不會(huì)用到C#特有的性質(zhì)。首先編寫IMobileStorage接口:1namespace InterfaceExample23    public interface IMobileStorage4    5        void Read();/從自身讀數(shù)據(jù)6   

20、;     void Write();/將數(shù)據(jù)寫入自身7    8比較簡(jiǎn)單,只有兩個(gè)方法,沒(méi)什么好說(shuō)的,接下來(lái)是三個(gè)移動(dòng)存儲(chǔ)設(shè)備的具體實(shí)現(xiàn)代碼:U盤 1namespace InterfaceExample 2 3    public class FlashDisk : IMobileStorage 4     5

21、60;       public void Read() 6         7            Console.WriteLine("Reading from FlashDisk"); 8   

22、0;        Console.WriteLine("Read finished!"); 9        1011        public void Write()12        13  

23、;          Console.WriteLine("Writing to FlashDisk");14            Console.WriteLine("Write finished!");15        1

24、6    17MP3 1namespace InterfaceExample 2 3    public class MP3Player : IMobileStorage 4     5        public void Read() 6  &#

25、160;      7            Console.WriteLine("Reading from MP3Player"); 8            Console.WriteLine("Read finished!&

26、quot;); 9        1011        public void Write()12        13            Console.WriteLine("Writing&#

27、160;to MP3Player");14            Console.WriteLine("Write finished!");15        1617        public void PlayMusic()18 &#

28、160;      19            Console.WriteLine("Music is playing");20        21    22移動(dòng)硬盤 1namespace InterfaceExample 2&

29、#160;3    public class MobileHardDisk : IMobileStorage 4     5        public void Read() 6         7     

30、       Console.WriteLine("Reading from MobileHardDisk"); 8            Console.WriteLine("Read finished!"); 9        1011

31、        public void Write()12        13            Console.WriteLine("Writing to MobileHardDisk");14     

32、       Console.WriteLine("Write finished!");15        16    17      可以看到,它們都實(shí)現(xiàn)了IMobileStorage接口,并重寫了各自不同的Read和Write方法。下面,我們來(lái)寫Computer: 1namespace Interface

33、Example 2 3    public class Computer 4     5        private IMobileStorage _usbDrive; 6 7        public IMobileStorage U

34、sbDrive 8         9            get10            11             &#

35、160;  return this._usbDrive;12            13            set14            15     

36、           this._usbDrive = value;16            17        1819        public Computer()20&

37、#160;       21        2223        public Computer(IMobileStorage usbDrive)24        25        &

38、#160;   this.UsbDrive = usbDrive;26        27    28        public void ReadData()29        30     &#

39、160;      this._usbDrive.Read();31        3233        public void WriteData()34        35        

40、60;   this._usbDrive.Write();36        37    38      其中的UsbDrive就是可替換的移動(dòng)存儲(chǔ)設(shè)備,之所以用這個(gè)名字,是為了讓大家覺(jué)得直觀,就像我們平常使用電腦上的USB插口插拔設(shè)備一樣。      OK!下面我們來(lái)測(cè)試我們的“電腦”和“移動(dòng)存儲(chǔ)設(shè)備”是否工作正常。我是用的C#控制臺(tái)程序,具體代

41、碼如下: 1namespace InterfaceExample 2 3    class Program 4     5        static void Main(string args) 6         7 

42、0;          Computer computer = new Computer(); 8            IMobileStorage mp3Player = new MP3Player(); 9     

43、0;      IMobileStorage flashDisk = new FlashDisk();10            IMobileStorage mobileHardDisk = new MobileHardDisk();1112        

44、    Console.WriteLine("I inserted my MP3 Player into my computer and copy some music to it:");13            computer.UsbDrive = mp3Play

45、er;14            computer.WriteData();15            Console.WriteLine();1617            Console.WriteLine("Well,I&#

46、160;also want to copy a great movie to my computer from a mobile hard disk:");18            computer.UsbDrive = mobileHardDisk;19    &#

47、160;       computer.ReadData();20            Console.WriteLine();2122            Console.WriteLine("OK!I have to read so

48、me files from my flash disk and copy another file to it:");23            computer.UsbDrive = flashDisk;24           

49、; computer.ReadData();25            computer.WriteData();26            Console.ReadLine();27        28    29 &

50、#160;    現(xiàn)在編譯、運(yùn)行程序,如果沒(méi)有問(wèn)題,將看到如下運(yùn)行結(jié)果:      好的,看來(lái)我們的系統(tǒng)工作良好。 后來(lái)      剛過(guò)了一個(gè)星期,就有人送來(lái)了新的移動(dòng)存儲(chǔ)設(shè)備NewMobileStorage,讓我測(cè)試能不能用,我微微一笑,心想這不是小菜一碟,讓我們看看面向接口編程的威力吧!將測(cè)試程序修改成如下: 1namespace InterfaceExample 2 3    cl

51、ass Program 4     5        static void Main(string args) 6         7            Computer comput

52、er = new Computer(); 8            IMobileStorage newMobileStorage = new NewMobileStorage(); 910            Console.WriteLine("Now,

53、I am testing the new mobile storage:");11            computer.UsbDrive = newMobileStorage;12            computer.ReadData();13 

54、60;          computer.WriteData();14            Console.ReadLine();15        16    17編譯、運(yùn)行、看結(jié)果:      哈哈,神

55、奇吧,Computer一點(diǎn)都不用改動(dòng),就可以使新的設(shè)備正常運(yùn)行。這就是所謂“對(duì)擴(kuò)展開放,對(duì)修改關(guān)閉”。      又過(guò)了幾天,有人通知我說(shuō)又有一個(gè)叫SuperStorage的移動(dòng)設(shè)備要接到我們的Computer上,我心想來(lái)吧,管你是“超級(jí)存儲(chǔ)”還是“特級(jí)存儲(chǔ)”,我的“面向接口編程大法”把你們統(tǒng)統(tǒng)搞定。      但是,當(dāng)設(shè)備真的送來(lái),我傻眼了,開發(fā)這個(gè)新設(shè)備的團(tuán)隊(duì)沒(méi)有拿到我們的IMobileStorage接口,自然也沒(méi)有遵照這個(gè)約定。這個(gè)設(shè)備的讀、寫方法不叫Read和Write,而是叫rd和wt

56、,這下完了不符合接口啊,插不上。但是,不要著急,我們回到現(xiàn)實(shí)來(lái)找找解決的辦法。我們一起想想:如果你的Computer上只有USB接口,而有人拿來(lái)一個(gè)PS/2的鼠標(biāo)要插上用,你該怎么辦?想起來(lái)了吧,是不是有一種叫“PS/2-USB”轉(zhuǎn)換器的東西?也叫適配器,可以進(jìn)行不同接口的轉(zhuǎn)換。對(duì)了!程序中也有轉(zhuǎn)換器。      這里,我要引入一個(gè)設(shè)計(jì)模式,叫“Adapter”。它的作用就如現(xiàn)實(shí)中的適配器一樣,把接口不一致的兩個(gè)插件接合起來(lái)。由于本篇不是講設(shè)計(jì)模式的,而且Adapter設(shè)計(jì)模式很好理解,所以我就不細(xì)講了,先來(lái)看我設(shè)計(jì)的類圖吧: 

57、60;    如圖所示,雖然SuperStorage沒(méi)有實(shí)現(xiàn)IMobileStorage,但我們定義了一個(gè)實(shí)現(xiàn)IMobileStorage的SuperStorageAdapter,它聚合了一個(gè)SuperStorage,并將rd和wt適配為Read和Write,SuperStorageAdapter的具體代碼如下: 1namespace InterfaceExample 2 3    public class SuperStorageAdapter :

58、60;IMobileStorage 4     5        private SuperStorage _superStorage; 6 7        public SuperStorage SuperStorage 8       

59、;  9            get10            11                return this._superStorage;12 

60、           13            set14            15             

61、60;  this._superStorage = value;16            17        18    19        public void Read()20   

62、     21            this._superStorage.rd();22        2324        public void Write()25      

63、60; 26            this._superStorage.wt();27        28    29好,現(xiàn)在我們來(lái)測(cè)試適配過(guò)的新設(shè)備,測(cè)試代碼如下: 1namespace InterfaceExample 2 3    class Prog

64、ram 4     5        static void Main(string args) 6         7            Computer computer =

65、0;new Computer(); 8            SuperStorageAdapter superStorageAdapter = new SuperStorageAdapter(); 9            SuperStorage superStorage&#

66、160;= new SuperStorage();10            superStorageAdapter.SuperStorage = superStorage;1112            Console.WriteLine("Now,I am testing th

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論