不一樣的多型

2021-09-08 06:54:30 字數 2147 閱讀 2670

多型(polymorphism)一詞源於生物學,顧名思義就是指多種形態。在物件導向世界裡,多型與繼承和封裝一起構成了三大核心概念。

在.net中,多型通常意味著子類對於父類一種衍變。子類繼承自父類,擁有父類所定義的一切(public或protected)成員。但同時,它又可以修改(重寫或複寫)這些成員,使其實現與父類以及其他子類完全不同。我們可以說,繼承體現了類的多型性

大家應該很熟悉duck的例子了吧?

public abstract class 

duck

public class

mallardduck

: duck

}public class

rubberduck

: duck

}public class

program

}

mallardduck和rubberduck雖然都繼承自抽象類duck,同樣擁有quack()方法,但它們卻有不同的實現,產生不同的結果。在宣告duck型別時,既可以例項化為mallard,也可以例項化為rubberduck,或者是其他繼承自duck的類,在執行時,將自動呼叫各個子類的實現。

多型的這些特性使依賴注入和面向抽象程式設計成為可能,其重要性不言而喻。

然而,既然多型是指同一類事物之間的不同形態,那麼我們為什麼要把對於多型的理解侷限於類的繼承關係呢?在.net中是否還存在著非繼承關係的多型性呢?

型別引數在泛型中通常解釋為佔位符,而我更願意將其理解為對引數的一種抽象。以最常見的list為例,list和list在語法上完全相同,僅僅是型別引數有所不同,然而它們卻是兩個完全不同的類。也就是說,是型別引數的不同,導致了不同的類的形態。

public class 

mylist

items[size++] = item;

}}

如果我們使用mylist,在內部就會宣告乙個字串陣列,add方法的引數也必須為string。如果使用mylist,在內部就會宣告乙個int陣列,add方法的引數也必須為int。這看上去就像是t是string和int的「基類」,在使用mylist時(相當於客戶端**),t既可以是string也可以是int,或者是其他符合約束的型別,但在設計時,我們對這一切毫無所知。

您是否也覺得這是多型性的一種體現呢?

再來看看十分經典的swap的例子。

public class 

}

swap泛型方法就像是封裝了n個非泛型的swap方法,如swap(ref int o1, ref int o2)、swap(ref string o1, ref string o2)等等。在型別推斷特性的支援下,您甚至可以像使用非泛型方法一樣來使用泛型方法。引數t在某種程度上體現了不同的引數形態,因此我們有理由認為,泛型型別t體現了引數的多型性。

委託是對擁有相同引數和返回值的所有方法的封裝。只要方法擁有同樣的引數列表和返回值,委託都認為它們屬於同一「型別」的方法,可以新增到同乙個委託鍊錶中。

public delegate void 

foodelegate

(list

<

string

> list,

string

str);

public class

delegatetest

public static void

printifcontains(

list

<

string

> list,

string

strtocheck)

}public class

program

}

在上例中,foodelegate委託封裝了引數為list和string,並且沒有返回值的方法。任何符合上述約束的方法,在foodelegate中一視同仁。如,addtolist例項方法與printifcontains靜態方法除了引數列表與返回值相同外,內部實現完全不同,但是它們卻可以新增到同乙個委託鍊錶中。也就是說,同乙個委託,可以定義並呼叫不同的方法(約束相同而實現不同)。

您是否也認為這是方法的多型性的一種體現呢?

您可能覺得本文缺乏技術含量。的確是的,本文並不包含多麼高深的技術和思想,而只是筆者最近學習過程中一些瑣碎的領悟。如果能夠幫助到您,將是筆者的榮幸。

不一樣又不一樣的 木板接水

空地上豎立著n個從左到右排列的木板,它們可以把水擋住,但溢位最邊上木板的水將會流到空地上。已知木板間距都是單位1,現給定每個木板的高度,請求出總共能接住的水量?說明一點,這裡只考慮間距 寬度 和高度,不考慮第三個維度,因此水量是平方單位。木板高度分別是2,1,3,那麼我們可以接住2 2 4平方單位的...

我們不一樣

前輩們因自身實際的種種因素的影響而產生的認知,並不一定適用於我們自身。你可能從來不會去想乙個問題 你的觀點,來自 其實,它們絕大部分來自網路,它們或多或少地蠶食了你的判斷力。未來的路要怎麼走,沒有對與錯。有的,只是每乙個選擇所需要承擔的責任。我不想面臨,後之視今亦猶今之視昔的悲哀。我希望,未來回首,...

我們不一樣

這麼多年的兄弟 有誰比我更了解你 太多太多不容易 磨平了歲月和脾氣 時間轉眼就過去 這身後不散的筵席 只因為我們還在 心留在原地 張開手 需要多大的勇氣 這片天 你我一起撐起 更努力 只為了我們想要的明天 好好的 這份情好好珍惜 我們不一樣 每個人都有不同的境遇 我們在這裡 在這裡等你 我們不一樣 ...