C#语言使用多态(接口与override) ——帮您剔除对面向对象多态性的疑惑
多態(tài)是面向?qū)ο缶幊讨腥髾C(jī)制之一,其原理建立在"從父類繼承而來(lái)的子類可以轉(zhuǎn)換為其父類"這個(gè)規(guī)則之上,換句話說(shuō),能用父類的地方,就能用該類的子類.當(dāng)從父類派生了很多子類時(shí),由于每個(gè)子類都有其不同的代碼實(shí)現(xiàn),所以當(dāng)用父類來(lái)引用這些子類時(shí),同樣的操作而可以表現(xiàn)出不同的操作結(jié)果,這就是所謂的多態(tài).
● 編譯時(shí)的多態(tài)性
編譯時(shí)的多態(tài)性是通過(guò)重載來(lái)實(shí)現(xiàn)的。對(duì)于非虛的成員來(lái)說(shuō),系統(tǒng)在編譯時(shí),根據(jù)傳遞的參數(shù)、返回的類型等信息決定實(shí)現(xiàn)何種操作。
● 運(yùn)行時(shí)的多態(tài)性
運(yùn)行時(shí)的多態(tài)性就是指直到系統(tǒng)運(yùn)行時(shí),才根據(jù)實(shí)際情況決定實(shí)現(xiàn)何種操作。C#中,運(yùn)行時(shí)的多態(tài)性通過(guò)虛成員實(shí)現(xiàn)或者接口。
編譯時(shí)多態(tài)即函數(shù)重載,我這里不多說(shuō)了以下主要是通過(guò)override和Interface實(shí)現(xiàn)的多態(tài)。
一、Override。首先來(lái)創(chuàng)建三個(gè)類,一個(gè)是父類Base,其他兩個(gè)是繼承于Base的A類和B類,代碼如下
View Code class Base{public virtual void Method(){Console.WriteLine("我是父類的虛方法");}}class A : Base{public override void Method(){Console.WriteLine("我是A類的重寫父類方法");}}class B : Base{public override void Method(){Console.WriteLine("我是B類的重寫父類方法");}}然后在Main方法里面去調(diào)用它們
View Code class Program{static void Main(string[] args){overrideDemo();}static void overrideDemo(){//創(chuàng)建一個(gè)父類的數(shù)組Base[] bases = new Base[] { new A(), new B() };foreach(var item in bases){item.Method();}}}運(yùn)行結(jié)果如下
發(fā)現(xiàn)父類的Method方法根本就沒(méi)有運(yùn)行,也就是數(shù)組雖然是Base類型,但是他們分別是A類和B類的實(shí)例,而這兩個(gè)類對(duì)Method方法進(jìn)行了override,因而執(zhí)行的是他們重寫的函數(shù),而接口也是類似的,不同的是我們不需要override關(guān)鍵字。
View Code public interface IBase{void Method();}public class C : IBase{public void Method(){Console.WriteLine("我是C類實(shí)現(xiàn)接口的方法");}}public class D : IBase{public void Method(){Console.WriteLine("我是D類實(shí)現(xiàn)接口的方法");}}調(diào)用示例:
View Code static void Main(string[] args){interfaceDemo();}static void interfaceDemo(){//創(chuàng)建一個(gè)接口的數(shù)組IBase[] bases = new IBase[] { new C(), new D() };foreach (var item in bases){item.Method();}}運(yùn)行結(jié)果和上面的類似,雖然類型相同,但是是誰(shuí)的實(shí)例就調(diào)用誰(shuí)的方法,彼此獨(dú)立。
多態(tài)的運(yùn)用場(chǎng)景很多,特別是在設(shè)計(jì)模式當(dāng)中,幾乎是離不開多態(tài),但是并不是說(shuō)繼承就很棒,如果我們的程序有很深的繼承層次,將會(huì)提高耦合度,程序則變得復(fù)雜。我們使用多態(tài)的思想就是,抽象他們的共同點(diǎn),不去考慮他們的具體實(shí)現(xiàn)。
理論的東西我就不羅嗦了,這里給一個(gè)實(shí)際當(dāng)中使用的例子
http://www.cnblogs.com/FreeDong/archive/2012/08/11/2627198.html
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/FreeDong/archive/2012/08/11/2626312.html
總結(jié)
以上是生活随笔為你收集整理的C#语言使用多态(接口与override) ——帮您剔除对面向对象多态性的疑惑的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 阿里巴巴使命、愿景、价值观、绩效管理中的
- 下一篇: c# char unsigned_dll