\quad物件的多型性是怎麼體現的,與過載有什麼不同
\quad
現在有這樣乙個需求:
\quad
\quad
要求結合物件的多型性,對乙個簡易的商場打折系統的**進行重構:
">public static int calculateprice(string discountstrategy, int price, user user) else
}default:
throw new illegalstateexception("should not be here!");
}}
\quad
\quad
其實題目想表達的意思說直白點就是:當我們將上面的**寫完後,我們會覺得該實現的需求都實現了,很好。但是,當我們需在裡面增加一種情況,比如5折時,我們就需要在case中新增乙個情況,如果有1000種情況,那麼就有1000個case,可讀性非常差。那麼根據題目的意思,我們需要做的就是把每一種情況,單獨放到乙個方法中,單獨實現。
\quad
\quad
實現思路:
\quad
\quad
1.定義父類方法,可以任意實現一種折扣方法。後面可以根據該父類方法,利用子類對父類方法的重寫,在子類中實現其他方法。
\quad
\quad
舉例說明:對於意外情況的實現
">public class discountstrategy
}
\quad
\quad
2. 為每種情況建立乙個單獨的方法,分別返回該種折扣情況下的應付金額。
\quad
\quad
舉例說明:對於vip使用者實行95折的情況的實現
">public class onlyvipdiscountstrategy extends discountstrategy
return price;
}}
\quad
\quad
3.到這裡應該可以發現,在每一種方法中都有price、user這兩個引數,每次不同的就是呼叫的方法不同。那麼將方法中的公共部分提取出來,用以提供乙個統一的對外介面,讓該介面去根據傳入該方法的引數選擇不同的實現方式。
\quad
\quad
**如下:
">public class pricecalculator
}
\quad
\quad
最後,生成一下test測試,檢查**的實際效果:
">package com.github.hcsp.polymorphism;
import org.junit.jupiter.api.assertions;
import org.junit.jupiter.api.test;
public class pricecalculatortest
}
\quad
\quad
總結:自己在剛開始接觸到物件三大特性之一,"多型"時,總是不明白過載與多型的關係,有些地方說過載是多型的體現。在我的理解中,多型就是同一方法對不同引數所執行的不同的操作。比如**中的方法:
public static int calculateprice(discountstrategy strategy, int price, user user)
當我們呼叫該方法時,傳入的引數為:
pricecalculator.calculateprice(new discount95strategy(), 100, user.dios("屌絲"))
則呼叫全場95折的方法。從這個方面講,多型可以說是同一行為具有多個不同表現形式的能力。這樣說可能與過載有些類似,那麼過載是如何表現的,舉個例子:
public class test
public int caculate(int s1,int s2,int s3)
public static void main(string args)
}
\quad
\quad
多型的核心體現(方法的多型性,物件的多型性)
多型的概念 同乙個方法,在不同的情境下會有不同的表現 多型的核心體現主要有以下兩點 1 方法的過載 定義 同乙個方法名可以根據引數列表的不同呼叫不同的方法體 2 方法的覆寫 定義 同乙個父類的方法,可以根據例項化子類的不同也有不同的表現 前提 方法覆寫 1 物件的向上轉型 父類 父類物件 new 子...
類的多型性體現
引用多型 父類的引用可以指向本類的物件 父類的引用指向了自己的子類物件.方法多型 建立本類物件時,呼叫的方法為本類方法.建立子類物件時,呼叫的方法為子類重寫方法或繼承方法.注 不能訪問子類特有的方法 多型的前提 a.類與類之間必須有關係,要麼繼承,要麼實現 implement b.要有重寫 c.父類...
物件導向的多型 多型性
多型指的是一類事物有多種形態,比如水有多種形態 冰 水 水蒸氣,但都是h2o,下面定義乙個h2o的父類和三種形態的子類 class h2o def init self,name,temperature self.name name self.temperature temperature deftu...