多型(Polymorphism)
封裝(wrap)、繼承(inheritance)、過載(override)還是多型(polymorphism),亦或是其他?
在我看來,答案無疑將是多型。封裝是優點,繼承是基礎,過載是特點,而多型則是特徵。
雖然這四者缺一不可,無論少了哪一個,就像一個人缺胳膊少腿,使OO將不再是完整的,但是前三者對於OO來說好比鼻子耳朵,而多型則是生殖器,沒有多型的OO就象是被閹割的雄性,已經失去其典徵。
什麼是多型?
簡單來說,多型是具有表現多種形態的能力的特徵,在OO中是指,語言具有根據物件的型別以不同方式處理之,特別是過載方法和繼承類這種形式,的能力。多型被認為是面嚮物件語言的必備特性。
多型有多種分類,通過了解這些分類可以更豐滿對其認識,在這裡就不再羅列,請各位參考 wiki大百科 和 javaworld .
多型與泛型(generic)
多型實際上就是泛型。
所謂泛型就是指我們不為特定的型別進行專門編碼,而採用對不同型別進行通用編碼的方式,無論是資料結果還是演算法。
傳統的泛型是指類似以Template function的方式使引數一般化,典型的應用是C++ STL,比如List、Vector以及algorithm。
而OO已能通過介面(Interface)和抽象類(Abstract Class)進行真正意義上的泛型了。在我看來,這就是OO最精彩的地方,也就是多型的威力。而對於傳統意義上的Generic,我始終覺得其作用已經今不如昔了。
多型和繼承(Inheritance)
嚴格來說,多型與繼承、過載並不是孤立的,他們之間存在著緊密的聯絡,多型是建立在這兩者的基礎之上的(實際上繼承就有用過載這一特性)。
傳統的多型實際上就是由虛擬函式(Virtual Function)利用虛表(Virtual Table)實現的(早期C模擬OO特性時使用最多,C++的實現也是,後來的技術未作研究,是否使用VT不得而知),自然是離不開繼承,換句話說多型實際上覆蓋了繼承。
正是由於繼承與多型的緊密聯絡,使得我們很容易張冠李戴,那麼如何區別呢?
舉個常用的例子:
Abstract Class Sharp implement IHaveSide {
public bool isSharp(){
return true;
}
public abstract int getSides();
}
Class Triangle extends Sharp {
public override int getSides() {
return 3;
}
}
Class Rectangle extends Sharp {
pubilc override int getSides() {
return 4;
}
}
那麼這種類的關係叫做繼承,下面這種使用方式也是繼承所帶來的:
Triangel tri = new Triangle();
println("Triangle is a type of sharp? " + tri.isSharp());
而這種方式則是多型:
Sharp sharp = new Rectangle();
println("My sharp has " + sharp.getSides() + " sides.");
這兩者區別在哪?很顯然,繼承是子類使用父類的方法,而多型則是父類使用子類的方法。
其技術上的區別是繫結時期,晚期繫結一定是多型。
現代軟體設計
現代軟體大量的使用框架、模式(非特指Deisgn Pattern),也就是將軟體開發的一些共性進行抽象,提出普遍適用的軟體結構。
無論是框架還是模式,他們都有一些明顯的共同點 — 使用xml配置物件,大量使用介面採用所謂面向介面的方法,利用反射實現。
為什麼要介面?因為需要抽象,需要將未知的物件在已有的框架中表現。
如何實現介面?多型!所謂反射,實際上就是一種晚期繫結的技術,這個技術實質上表現出來的就是多型這一特徵。
面向方面開發(Aspect Oriented Programming)是一個熱點,也是現代軟體發展的趨勢。定製、元件裝配的軟體開發方式在應用越來越複雜、需求變化越來越快的今天顯得日趨重要。那麼如何才能使今天的軟體能夠適應明天需要呢?如何使我開發速度更快?如何能更容易的修改應用?AOP則是解決這些問題的有效手段。
讓我們看看框架容器的主要模式,Inversion of Control Containers(IoC)/Dependency Injection(包括setter injection, construct injection, interface injection等),其主要好處就是類之間的依賴,通過執行期的查詢來進行繫結。那麼他的基礎是什麼呢?還是多型!
我們可以看到,在現代軟體的開發中,無數的思想象火花一樣跳動。其中一類很重要的思想就是建立在多型這樣一個很基本的特性,甚至可以說是一個語言概念之上的。在這裡希望通過這篇文章拋磚引玉,引起更多的對與當今軟體發展發向的思考,同時探究其根源。
相關推薦
Java - 多型(polymorphism)
一 多型的基本概念 同一個方法呼叫,由於物件不同可能會有不同的行為。 多型是方法的多型,不是屬性的多型。 二 多型的條件 1.繼承(實現) 2.方法重寫 3.父類引用指向子類的物件 三 實現方式 1. 不同的子類對父類同一方法給出不同的實現 2. 父型別的引用指向子類例項物件 四
小例子大智慧2--C#中的多型Polymorphism
以上篇的實體型別為引子,我就直接貼過來了: Person例項型別: public class Person { public string Name; public string Sex; public int Ag
多型(Polymorphism)
如果讓你選擇一項面向對(Object Oriented,後文簡稱OO)象最重要的或者最能表現OO特點的技術特徵,會是什麼? 封裝(wrap)、繼承(inheritance)、過載(override)還是多型(polymorphism),亦或是其他? 在我看來,答案無疑
多型(Polymorphism)的簡單實現
實現一個簡單的執行時多型 繼承(extends) + 方法重寫(override) 直接上程式碼 一個超類Car, 三個子類BmwCar, AudiCar, PorscheCar。 其中show
scala中的多型 Ad-hoc polymorphism和type class
多型的型別(polymorphism) (1) parametric多型 下面例子來自scalaz教程: scala> def head[A](xs: List[A]): A = xs(0) head: [A](xs: List[A])A scala> head(1 :: 2 ::
OPP(面向物件)三大特性------多型(polymorphism)
1.多型概念:多型是指同一操作作用於某一類物件,可以有不同的解釋,產生不同的執行結果。通俗來講:某一類物件可以看做是動物,同一操作可以看做eat()方法,不同的解釋看做是不同的動物,不同結果看做是吃法不同。解析起來就是:動物都有吃的行為,狗是吃骨頭,羊是吃草。
《編程導論(Java)·2.1.2 啊,我看到了多態》-什麽是多態(polymorphism)
img page ria 使用方法 ride idt void one 標題 1.不明覺厲 很多人學習多態時,會認為。 之所以不明覺厲,由於多態的定義:事物存在的多種表現形態;而後,有人將重載(overload)、改寫(override)、多態變量和泛型歸結於同一個
c++之多型性(動態繫結)
多型性 指相同物件收到不同訊息或不同物件收到相同訊息時產生不同的實現動作。C++支援兩種多型性:編譯時多型性,執行時多型性。 a、編譯時多型性:通過過載函式實現 b、執行時多型性:通過虛擬函式實現 多型性可以簡單地概括為“一
菱形繼承和多型區別
菱形繼承 對於菱形繼承可參考這篇部落格:https://blog.csdn.net/sophia__yu/article/details/82791522 菱形繼承存在的問題是:資料冗餘和二義性; 在語法上解決資料冗餘和二義性:虛繼承 虛繼承底層:物件模型上,基類公共資料放在最下邊(因編譯器
Java繼承和多型的底層原理
當子類繼承父類以後,子類的物件為什麼可以訪問到父類中定義的方法?當子類Override了父類中的方法以後,訪問的是子類Override以後的方法,這是怎麼實現的?當子類Override了父類的方法以後,還有辦法得到父類的方法嗎?部落格:重寫(overwrite)、過載(overload)
再談面向物件中的封裝、繼承和多型
封裝 封裝說的是把資料封裝起來,對外暴露一個可以訪問的介面,不能讓外界直接訪問內部的資料。 從上面的描述可以抽取出兩種型別:介面和類。 從現在比較火的微服務的觀點上來看,一個類就是一個服務,一個物件就是一個服務的例項,通過這個服務暴露的介面來訪問這個服務。從這個意義上來講,面向
Java 面向物件 --多型性
1,方法的過載和重寫; 2,可以用父類的引用指向子類的具體實現,而且可以隨時更換為其他子類的具體實現; 父類Animal: package com.java1234.chap03.sec13; public class Animal { public void say(){
javaSE_day7_this關鍵字_____繼承____抽象方法____介面____多型
1.this關鍵字 解決成員變數和區域性變數同名問題 在成員變數前面加上this,來區分成員變數和區域性變數 //例:this.name this可以在構造方法之間進行呼叫,語法this() 2.繼承:子類繼承父類,也就繼承父類的屬性和方法 子類 e
09 面向物件_多型&抽象類&介面
09.01_面向物件(多型的概述及其程式碼體現) A:多型(polymorphic)概述 事物存在的多種形態 B:多型前提 a:要有繼承關係。 b:要有方法重寫。 c:要有父類引用指向子類物件。
Java的抽象類、多型
1.抽象類: 只是約定了了類的抽象行為,沒有具體的實現相應的行為。 2.場合: 此類不適合建立物件,使用子類的物件 此類,為所有子類提供了模板 3.語法: Abstract class 抽象類{ 類中的成員;
php多型的理解
php是面向物件的指令碼語言,而我們都知道,面向物件的語言具有三大特性:封裝,繼承,多型。php理應具有這三大特性。 封裝是類的構建過程,php具有;php也具有繼承的特性。唯獨這個多型,php體現的十分模糊。原因是php是弱型別語言。 java的多型體現的十分清晰,大體分兩類:父類引用指向子類物
【C++】物件函式的覆蓋、過載、多型
覆蓋 Coverage 在基類中定義了一個非虛擬函式,然後在派生類中又定義了一個同名同參數同返回型別的函式,既是覆蓋 在派生類物件上直接呼叫這個函式名,則只會呼叫派生類中的同名函式 #include <iostream> using namespace std;
3.Java面向物件程式設計OOA/OOP/OOD/OOAD()/UML類圖、函數語言程式設計Scala(JVM)---類與物件、封裝繼承多型、構造方法、覆寫/重寫/override
一、緒論 1.面向物件程式設計正規化(C++、Java、Go)------能進行現實生活的抽象。 每個物件都是一個類。類中包含屬性與方法。 OOA:面向物件分析 OOP:面向物件程式設計
多型物件模型
1.多型相關概念及使用時需要注意問題。 C++中類的繼承中有多型性的概念,所謂的多型就是在類裡使用虛擬函式後,用父類作為物件指標,來正確的呼叫不同子類或父類來作為相應虛擬函式。虛基類實際就是繼承時使用virtual關鍵字來定義,為的是讓在多重繼承時遇到相同的基類時只保留一份,以確定其使用那個類。
JAVA的多型----父類與子類轉換問題
JAVA語言中, 物件變數是多型的 每個子類物件都算是父類物件(子類物件可以當作父類變數所引用) 那反過來可不可以呢? 答案是取決於父類變數引用的是誰 如果父類變數引用的是子類物件的例項, 可以通過強轉被子類變數引用 如果父類變數引用的是父類物件的例項,則不能被為子類變數引用