C#小白:面向?qū)ο缶幊桃恍└拍畹牧私?/h1>
? ??? ?由于筆者一開始學(xué)習(xí)時(shí)對(duì)C#許多基本概念都不了解,導(dǎo)致在“開發(fā)”過程中出現(xiàn)各種“世紀(jì)難題”而苦惱半天。雖然最終可以得到解決,但過程中的“坐牢感”是非常難受的。所以我在此結(jié)合經(jīng)歷,以我自己的語(yǔ)言科普一下C#面向?qū)ο缶幊痰囊恍┗靖拍睢?/p>
? ?? ? 面向?qū)ο缶幊?/strong>是一種把分析現(xiàn)實(shí)世界對(duì)象特點(diǎn)的方法,帶入編程之中的思想。
? ? ? ?假設(shè):有一個(gè)越共玩家,他未過中年,卻性格狡猾,經(jīng)常躲在草叢中陰人,喜歡對(duì)別人進(jìn)行宗教宣傳。
? ? ? ?現(xiàn)在我們來(lái)分析:這個(gè)越共玩家,他的身份、年齡、性格都是其自身的屬性,可以被視為參考數(shù)值;而他陰人、傳教的表現(xiàn)都是他的行為,可以影響自己或他人。
? ? ? ? 按照C#概念的來(lái)說(shuō),這個(gè)越共就相當(dāng)于一個(gè)來(lái)自現(xiàn)實(shí)“對(duì)象”,對(duì)象是具有靜態(tài)部分(屬性)和動(dòng)態(tài)部分(行為,也稱 方法 )的。
所以,想理解下面這一的部分,也不算太難:
? ? ? ?void 在草叢陰人(Grass?躲哪棵草, People?陰哪個(gè)冤種)
? ? ? ?{
? ? ? ?}
如果你還未完全理解對(duì)象是什么,請(qǐng)往下看。
上文我們假設(shè)的越共,其實(shí)是基于于現(xiàn)實(shí)世界存在的人,為了研究而假設(shè)出來(lái)的,這就是對(duì)象。生活中人人用這個(gè)比喻哪個(gè),其實(shí)都是和對(duì)象一定關(guān)聯(lián)的。比如:

? ? ? ??
我們應(yīng)該知道現(xiàn)實(shí)世界存在的事物:嘢獸先輩。都知道
他的特點(diǎn):哼 ■ ■ ■■■■~■■■■■■~? ?
以及他的行為:■■昏睡紅茶。?
我們?cè)诹私膺@些信息后,腦子里才會(huì)根據(jù)這些信息形成概念。下一次我們?cè)倏吹健昂?■ ■ ■~”以及“昏睡紅茶”等關(guān)鍵信息時(shí),我們都知道,這些特點(diǎn)是在描述“野獸先輩”這個(gè)東西(對(duì)象),不是指現(xiàn)實(shí)的本人。
有沒有發(fā)現(xiàn),上述對(duì)象都有一個(gè)共性:他們都屬于 人類。

即? ? ? ? ? ? ? class?人類
? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? }
但他們?cè)趯儆谕惖那闆r下,又不盡相同。這就說(shuō)明:人類中很可能會(huì)有分支,人和人是有差異的,連同一種行為,不同的人也會(huì)有不同的表現(xiàn)。
這種情況下,我們就提出一個(gè)概念:子類
如:? ? ? ? ? class?人類
? ? ? ? ? ? ? ? ?{? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ?class 越共類:人類
? ? ? ? ? ? ?? ? ?? ? ?{
? ? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ?? ? }
? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ?class 野獸類:人類
? ? ? ? ? ? ?? ? ???? ?{
? ? ? ? ? ? ? ? ? ? ? ????
? ? ? ? ? ? ? ? ? ?? ??}
? ? ? ? ? ? ? ?? }
? ? ??“類名:類名”??意為? “子 承?父”?可以理解為:父類有什么,子類就可以有什么(基本上是這樣),這就是所謂“繼承”(面向?qū)ο缶幊倘筇卣髦?/strong>)
? ? ??
某天,你發(fā)現(xiàn)這個(gè) ?? ? ? ? ? ? ? ? abstract class?人類
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? }
讓人疑惑的是,這個(gè)“abstract”有啥用?!? ?當(dāng)然,如果想知道這是什么意思,請(qǐng)諸君自行翻譯吧。
翻譯好了嗎?公布答案:抽象。
諷刺的是,這個(gè)概念本身就很抽象。但是再查一查字典,可以發(fā)現(xiàn)它的含義:事物共性的提取。反正,無(wú)論加不加“abstract”,上述“野獸類”和“越共類”都是繼承于“人類”就是啦!
他們都會(huì)說(shuō)話!?但是,越共說(shuō)話時(shí)“風(fēng)吹草動(dòng)”、野獸說(shuō)話時(shí)“■ ■ ■ ■! ~”。
同一種類型的行為,在不同對(duì)象身上,會(huì)有不同的表現(xiàn),這就是“多態(tài)”(面向?qū)ο缶幊倘筇卣髦?/strong>)
這是使用"抽象"的一個(gè)原因了,因?yàn)槌橄箢惪梢院芎玫靥崛∽宇悅兊乃泄残裕@樣我不管對(duì)象是嘢獸還是越共,我都可以無(wú)視他們的差別,直接調(diào)用他們生而為人的行為——說(shuō)話!
自行感受一下:
? ? ? ?? ? ? ? ? abstract?class?人類
? ? ? ? ? ? ? ? ?{? ??
? ? ? ? ? ? ? ? ? ? ?? public?abstract void Speak();?
? ? ? ? ? ? ? ? ? ? ? ?abstract?class 越共類:人類
? ? ? ? ? ? ?? ? ?? ? ?{
? ? ? ? ? ? ? ? ? ? ? ? ? ? override?void Speak()
? ? ? ? ? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? print("風(fēng)吹草動(dòng)")
? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ?? ? }
? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ?class 野獸類:人類
? ? ? ? ? ? ?? ? ???? ?{? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ??override?void Speak()
? ? ? ? ? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? print("哼 哼?哈?■?■?■!?~")
? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ?? ??}
? ? ? ? ? ? ? ?? }
? ? ? ? ? ? ? ? ? ?人類 A = new?野獸();
? ? ? ? ? ? ? ? ? ?人類 B = new?越共();
? ? ? ? ? ? ? ? ? ? A.Speak();
? ? ? ? ? ? ? ? ? ? B.Speak();
__________________________________輸出結(jié)果________________________________
? ? ? ? ? ? ? ?風(fēng)吹草動(dòng)
? ? ? ? ? ? ? ?哼?哼?哈?■?■?■!?~
? ? ? ? __________________________________________________________________
無(wú)須擔(dān)心報(bào)錯(cuò),因?yàn)椤癮bstract”抽象類本來(lái)就是用來(lái)做這個(gè)的:將收到的 調(diào)用方法命令 傳輸給 已經(jīng)繼承并實(shí)現(xiàn)方法的子類,而不是 傳輸給方法都不能實(shí)現(xiàn)的自己執(zhí)行。
特別說(shuō)明:加了前綴“abstract”的方法?抽象類中的抽象方法是不能“實(shí)現(xiàn)”的哦(即:沒有內(nèi)容)!? ? ? ? 但是在子類可以,不過要加上“override”(重寫)前綴。
連個(gè) “{ }”?也不能有哦!
沒有“實(shí)現(xiàn)”抽象方法的孩子要挨打?。ㄗ宇惾绻粚?shí)現(xiàn)抽象父類的所有方法,它也會(huì)變成抽象行為。因?yàn)槌橄蟾割惐旧砭褪?strong>所有子類共性的體現(xiàn)嘛,它里面的東西也是子類們應(yīng)該有的)
現(xiàn)在,我再來(lái)講講“虛方法”:
? ? ? ? ? ? ? ? ? ?virtual?void?Speak()
? ? ? ? ? ? ? ? ? ?{
? ? ? ? ? ? ? ? ? ?}
和抽象方法不同,它:
⑴可以被子類繼承重寫或否
⑵在?子類 和 被繼承類(創(chuàng)建其自己的類)?中都可以被實(shí)現(xiàn),且?必須 被實(shí)現(xiàn)(必須有內(nèi)容)。
⑶可以在非抽象類或抽象類創(chuàng)建(即?聲明)
而抽象方法:
⑴必須被子類繼承重寫
⑵只能在 子類?中被實(shí)現(xiàn)
⑶只能在非抽象類創(chuàng)建(即?聲明)
⑷若被繼承類中的所有抽象方法不被子類實(shí)現(xiàn),子類也會(huì)成為抽象類
所以,虛方法和抽象方法在用法上有什么不同呢?
讓我們回到
? ? ? ? ? ? ? ? ? ?人類 A = new?野獸();
? ? ? ? ? ? ? ? ? ?人類 B = new?越共();
? ? ? ? ? ? ? ? ? ? A.Speak();
? ? ? ? ? ? ? ? ? ? B.Speak();? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?public?void Speak()
⑴當(dāng)普通類“人類”的Speak()為虛方法且在“人類”中實(shí)現(xiàn):? ? ? ? ? ? ??{
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ?print("我是人類")
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ?}? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ?此時(shí):? ?A.base.Speak();
? ? ? ? ? ? ? B.base.Speak();
? ? 可用,將輸出 “我是人類”
⑵當(dāng)“人類”的Speak()為未實(shí)現(xiàn)的虛方法?或?“人類”為抽象類且聲明了Speak()這個(gè)抽象方法
A和B的輸出值將分別為 野獸.Speak()?和?越共.Speak()
那么,本篇不正規(guī)的教程就結(jié)束啦,歡迎指正錯(cuò)誤!