1. 程式人生 > >什麼是多型?為什麼用多型?有什麼好處?多型在什麼地方用?

什麼是多型?為什麼用多型?有什麼好處?多型在什麼地方用?

什麼是多型?

概念:同一操作作用於不同的物件,可以有不同的解釋,產生不同的執行結果,這就是多型性。簡單的說:就是用基類的引用指向子類的物件。

為什麼要用多型呢?

原因:我們知道,封裝可以隱藏實現細節,使得程式碼模組化;繼承可以擴充套件已存在的程式碼模組(類);它們的目的都是為了——程式碼重用。而多型除了程式碼的複用性外,還可以解決專案中緊偶合的問題,提高程式的可擴充套件性.。耦合度講的是模組模組之間,程式碼程式碼之間的關聯度,通過對系統的分析把他分解成一個一個子模組,子模組提供穩定的介面,達到降低系統耦合度的的目的,模組模組之間儘量使用模組介面訪問,而不是隨意引用其他模組的成員變數。

多型有什麼好處?

有兩個好處:

1. 應用程式不必為每一個派生類編寫功能呼叫,只需要對抽象基類進行處理即可。大大提高程式的可複用性。//繼承 
2. 派生類的功能可以被基類的方法或引用變數所呼叫,這叫向後相容,可以提高可擴充性和可維護性。 //多型的真正作用,

多型在什麼地方用?

可以用在方法的引數中和方法的返回型別中。

在方法中的引數,請看下面的例子:

複製程式碼
   public abstract class Driver
    {
        public void run();//讓子類來執行
    }


class SBenz : Driver
    {
        public void run()
        {
            Console.WriteLine("Benz在以200邁的速度在run");
        }
    }




 class JD : Driver
    {
        public void run()
        {
            Console.WriteLine("JD is running...");
        }
    }


 class Person
    {
        private Driver driver;
        public Person()
        {

        }
        public Person(Driver driver)
        {
            this.driver = driver;
        }
        public void drive()
        {
            driver.run();
        }
        public void setDriver(Driver driver)
        {//運用引數多型,以後不管買什麼車都可以
            this.driver = driver;
        }
   }




static void Main(string[] args)
        {
            Person p = new Person();
            JD jd = new JD();//剛開始沒錢就買輛JD吧
            p.setDriver(jd);
            p.drive();
            SBenz benz = new SBenz();//有錢換車了
            p.setDriver(benz);
            p.drive();
        }
複製程式碼

在方法的返回型別中,請看下面的例子:

上面的例子中,不管是JD還是Benz都是我們自己直接new出來的.我們可以設計一個工廠類,專門生成汽車

/**
*   我們將多型使用在方法的返回型別中
*   Driver可以是抽象類,也可以是介面,JD和Benz分別繼承該類或實現該藉口

*/

複製程式碼
 public class CarFactory
    {
        public Driver factory(String carName)
        {
            if (carName.Equals("JD"))
            {
                return new JD();
            }

            else if (carName.Equals("Benz"))
            {
                return new SBenz();
            }

            else
            {
                Console.WriteLine("對比起,不伺候");
                return null;
            }
        }
    }
複製程式碼

這實際上就是設計模式中的簡單工廠模式!

型別的引數.,傳入引數的時候,可以傳入任何一個類的物件,只要是對應的類的物件名稱就可以了
這就是多型的應用!

相關推薦

“類參數的約束”和“類參數約束”大區別

gen ble table https 具體類 來源 個人簡介 per bject 雖然只相差一個字,但是區別還是挺大的。 先看看兩個詞的英文表述:constraints on type parameters和type parameters as constraints

什麼是?為什麼?什麼好處?在什麼地方

什麼是多型? 概念:同一操作作用於不同的物件,可以有不同的解釋,產生不同的執行結果,這就是多型性。簡單的說:就是用基類的引用指向子類的物件。 為什麼要用多型呢? 原因:我們知道,封裝可以隱藏實現細節,使得程式碼模組化;繼承可以擴充套件已存在的程式碼模組(類);它們

了這麼多年的泛,你對它到底瞭解?

現代程式設計師寫程式碼沒有人敢說自己沒用過泛型,這個泛型模板T可以被任何你想要的型別替代,確實很魔法很神奇,很多人也習以為常了,但就是這麼有趣的泛型T底層到底是怎麼幫你實現的,不知道有多少人清楚底層玩法,這篇我就試著來分享一下,不一定全對哈。。。 一:沒有泛型前 現在的netcore 3.1和最新的.netf

了這麼多年的 Java 泛,你對它到底瞭解?

> 本篇文章 idea 來自[用了這麼多年的泛型,你對它到底有多瞭解?](https://www.cnblogs.com/huangxincheng/p/12764925.html),恰好當時看了「深入 Java 虛擬機器的第三版」瞭解泛型的一些歷史,感覺挺有意思的,就寫了寫 Java 版的泛型。 作為一個

C++建構函式中呼叫虛擬函式是否的效果

C++多型的一個重要應用就是虛擬函式。但是當我們再基類的建構函式中呼叫一個子類過載的虛擬函式會出現多型的效果嗎?我們具體看一下下面的例項: #include <iostream> #define P(x) std::cout<<x<<std::endl;

一些關於 Iterator 與 與 Collection 與 Iterable 的聯絡 總結 (Iterator 與 可以解釋為什麼說 iterator方法中存在)

其中可能有部分引用,有些是在 百度 上直接搜到的短小的回答,有些是我前幾篇文章中轉載的。 一、附上參考的連結: (1) 名稱:Java Iterable和Iterator有什麼區別和聯絡? 連結:http://wenwen.sogou.com/z/q6588289

把時間在最“生產力”的地方

        歌德曾經說過:“我們都擁有足夠的時間,只是要好好地善加利用。一個人如果不能有效利用有限時間,就會被時間俘虜,成為時間的弱者。一旦在時間上成為弱者,他將永遠是一個弱者。因為放棄時間的人,同樣也被時間放棄。”         對最高價值的事情投入最充分的時間,你在工作中的效率一定會提高。當你高效

C語言巨集實現靜態

綜述 多型性是面向物件程式設計的一個重要特徵。 在C++語言中,多型指的是:具有不同功能的函式可以用同一個函式名,可以用一個函式名呼叫不同內容的函式。 C++的多型分為兩種: 1. 靜態多型性(編譯時多型):在程式編譯時系統就能決定呼叫的是哪個函式,因此稱為編譯時多型

態(upcast)減少分支判斷 以及 態繼承設計、具體類判斷。

ret ada ati 改變 over post () 子類 cto Influenced by 《java 八榮八恥》,翻了下《java編程思想》 印象中多態產生的條件:1.子類繼承父類 2.父類【指針】指向子類 3.父類引用調用重寫(@Override)方法   *

合並個cv::Mat類,即合並個圖片的接口

區域 使用 depth left img style return urn 創建 1、 cv::Mat get_merage_image(cv::Mat cur_frame) { cv::Mat image_one=cur_frame; cv::Mat image_

thinkphp5關聯,中間表進行關聯

這是中間表,不要問我為什麼這麼設計,這是領導要求的 CREATE TABLE `at_relation_table` ( `id` int(11) NOT NULL AUTO_INCREMENT, `aid` int(11) NOT NULL COMMENT 'aid', `bid`

c++三大特性(繼承,封裝,)及過載與的區別。

    封裝可以隱藏實現細節,使得程式碼模組化,繼承可以擴充套件已存在的模組,它們目的都是為了:程式碼重用。而多型是為了實現另一個目的:介面重用。     封裝是面向物件的特徵之一,是物件和類概念的主要特性。封裝是把過程和資料包圍起來,

【java】--泛-型別擦除與的衝突和解決方法

型別擦除與多型的衝突和解決方法 現在有這樣一個泛型類: [java] view plain copy print ? class Pair<T>&

laravel 1對,主鍵不是整的坑

使用Eloquent 的一對多模型 例子:訂單表對應多個訂單明細,訂單表id為非自增的字串 1 namespace App\Http\Model; 2 3 4 class Order extends BaseModel 5 { 6 protect

C++中的、單繼承、繼承、菱形繼承、菱形虛擬繼承

C++中的繼承體系,有單繼承、多繼承、菱形繼承、菱形虛擬繼承,以及各型別的物件模型,我們今天做一個簡單的剖析 (1)什麼多型? 所謂多型,就是“多種形態”。在面向物件的方法中一般是這樣描述多型的:向不同的物件傳送同一個訊息,不同的物件在接收時會產生不同的行為(即方法)。 多

【C++】—(上)動態

一、多型 1、 概念:同一事物表現出的多種形態,同一操作作用於不同的物件,可以有不同的解釋,產生不同的執行結果。在執行時,可以通過指向基類的指標,來呼叫實現派生類中的方法。 2、 舉例子: #include<windows.h> class WashRoom { pu

java基礎複習(集合、泛、IO流、執行緒、Junit 、內省 、Properties、 路徑問題)

集合 ---|Collection: 單列集合 ---|List: 有儲存順序, 可重複 ---|ArrayList: 陣列實現, 查詢快, 增刪慢 由於是陣列

MVP泛+xRecyclerView+Retrofit+OkHttp+RxJava條目,橫向

這是所用到的依賴 compile 'com.android.support:recyclerview-v7:26.1.0' compile 'com.squareup.retrofit2:retrofit:2.3.0' compile "io.reactivex.rx

移動端一次上傳個圖片(動態建立file別的input)

描述 最近在做公司的一個移動端上傳圖片的業務,如果這是在PC端,將非常的簡單,因為給input設定屬性multiple後PC端按住ctrl鍵就可以一次性選擇多個圖片,但是在移動端確不可以,移動端選擇一張圖片後會自動返回到APP中,想再新增一張的話還需要再次進入

【大話設計模式】——行為模式總結(一對

    根據上上一篇部落格的分類,這篇部落格總結一下有一對多關係的模式:職責鏈,中介者,觀察者,迭代器。其實這幾個模式沒什麼大關係,也沒什麼可以比較的,硬是讓我把它們放在了一起。 一、職責鏈(Cha