上一篇講了一部分物件導向的特性,今天要來講多型,在此之前要先介紹介面(interface),以及他的用法
假設我今天要做計算機的程式,運算子都要自己寫,我該怎麼做?
我先定義要做的範圍為兩個數的「加、減、乘、除」,之後先寫一個介面
public interface Operator
{
decimal GetResult(decimal x, decimal y);
}
之後要定義加減乘除的類別
public class Addition : Operator
{
public decimal GetResult(decimal x, decimal y)
{
return x+y;
}
}
public class Subtraction : Operator {
public decimal GetResult(decimal x, decimal y) {
return x-y;
}
}
public class Multiplication : Operator {
public decimal GetResult(decimal x, decimal y) {
return x*y;
}
}
public class Division : Operator {
public decimal GetResult(decimal x, decimal y) {
if (y == 0)
{
throw new ArgumentException("除數不可為0");
}
return x/y;
}
}
這樣寫,是因為你無法確定使用者會輸入什麼,因此需要動態的建立物件,透過介面來完成你的計算機主程式
你的運算邏輯可能會是長這樣
public decimal Operate(decimal x, Operator o, decimal y)
{
return o.GetResult(x, y);
}
透過介面,你不用明確定義傳入的參數為哪種class,而是直接將運算子動態的傳入到方法裡面,再去呼叫介面定義的方法回傳結果,這種讓物件可以為多種型別的特性,就叫多型。
關於一個類別能否轉換自己以外的型別,除了用介面來寫出多型的Code,也可以看它是否有繼承關係,透過先抽取出共同邏輯的父類別來讓程式碼具有多型特性,這樣的程式碼就可以很好具有彈性,改動時要改的地方也比較少了,但要注意子類可以轉父類別,父類別卻不能轉子類別。