參考文章:
1.什麼是多型
2.多型有什麼優勢
3.多型怎麼用
概念:通過繼承實現的不同物件呼叫相同的方法,表現出不同的行為,稱之為多型。
多型有什麼優勢;
1、提高了**的維護性(繼承保證)
2、提高了**的擴充套件性(由多型保證)
public class animal
}public class cat : animal
}public class dog : animal
}class tester
}}
輸出如下:
animal eat...
cat eat...
dog eat...
在上面的例子中,通過繼承,使得animal物件陣列中的不同的物件,在呼叫eat()方法時,表現出了不同的行為。
多型的實現看起來很簡單,要完全理解及靈活的運用c#的多型機制,也不是一件容易的事,有很多需要注意的地方。
new的用法
public class animal
}public class cat : animal
}class tester
}
執行結果為:
animal eat...
animal eat...
cat eat...
可以看出,當派生類cat的eat()方法使用new修飾時,cat的物件轉換為animal物件後,呼叫的是animal類中的eat()方法。其實可以理解為,使用new關鍵字後,使得cat中的eat()方法和animal中的eat()方法成為毫不相關的兩個方法,只是它們的名字碰巧相同而已。所以, animal類中的eat()方法不管用還是不用virtual修飾,也不管訪問許可權如何,或者是沒有,都不會對cat的eat()方法產生什麼影響(只是因為使用了new關鍵字,如果cat類沒用從animal類繼承eat()方法,編譯器會輸出警告)。
abstract-override實現多型
我們在來討論一下用abstract修飾的抽象方法。抽象方法只是對方法進行了定義,而沒有實現,如果乙個類包含了抽象方法,那麼該類也必須用abstract宣告為抽象類,一個抽象類是不能被例項化的。對於類中的抽象方法,可以再其派生類中用override進行重寫,如果不重寫,其派生類也要被宣告為抽象類。
public abstract class animal
public class cat : animal//若不重寫則此類需要為抽象類
}public class dog : animal
}public class wolfdog : dog
}class tester
}}
cat eat...
dog eat...
wolfdog eat...
從上面可以看出,通過使用abstract-override可以和virtual-override一樣地實現多型,包括多層繼承也是一樣的。不同之處在於,包含虛擬方法的類可以被例項化,而包含抽象方法的類不能被例項化。
/// /// 飛 介面
///
public inte***ce iflyable
/// /// 喜鵲:子類,實現iflyable介面
///
public class magpie:bird,iflyable
/// /// 實現 iflyable介面方法
///
public void fly()
}
若只實現乙個功能,能使用介面最為方便。
什麼時候用介面什麼時候用抽象?
抽象:是對相同屬性和方法的提煉而得
介面:是對相同行為不同實現方法的提煉
在此之前堅持三個原則
第一次用到某個功能時,你寫乙個特定的解決方法;
第二次又用到的時候,你拷貝上一次的**;
第三次出現的時候,你才著手"抽象化",寫出通用的解決方法
說點自己的看法,先寫方法,若多次重複使用則可考慮多型。
介面多型靜態工廠設計模式模板設計模式
1,介面 什麼是介面?介面就是乙個特殊的抽象函式,裡面的方法全部是public abstract型別的方法,必須全部進行重寫。為什麼要是用介面?可以多繼承成多實現,對公升級拓展很方便 如何使用介面?通過關鍵字inte ce來定義乙個介面,通過implements來實現介面。2,多型 什麼是多型?事物...
繼承設計之狀態模式 多型
看到這裡有個狀態模式我就比較激動了,前面面試的時候被這個設計模式虐得太慘了,各種不會。正好這裡學習一下,看個例子。class actor public void act class sadactor extends actor class stage public void performplay ...
如何拓展設計思維
近期參加小組週會,其中乙個環節是營銷設計組的作品點評,雖然自己有很長一段時間沒有設計這類需求,但一直在關注,平時不定期的收藏了一些和網頁,拿出來與大家分享,並且從幾個方面來談談怎樣的設計能給人留下深刻印象。什麼是設計?時勢結合 緊隨潮流,激發思想和感情上的共鳴 結合當前社會事件如釣魚島 奧運會 中秋...