欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#中實(shí)現(xiàn)多繼承的方法

 更新時(shí)間:2014年08月30日 11:11:08   作者:張宏杰  
這篇文章主要介紹了C#中實(shí)現(xiàn)多繼承的方法,本文通過(guò)給接口添加擴(kuò)展的方法實(shí)現(xiàn)了C#的多繼承,需要的朋友可以參考下

近日看到了一個(gè)貼子,就是在C#語(yǔ)言中,如何實(shí)現(xiàn)多繼承的問(wèn)題。相信涉獵c#不多的人(像我這樣的菜鳥),一看就覺(jué)得很可笑,c#肯定是不能實(shí)現(xiàn)多繼承的啊。都知道在c++中因?yàn)閷?shí)現(xiàn)多繼承會(huì)有很多的歧義問(wèn)題,所以在c#中就把多繼承給取消了,而用接口來(lái)實(shí)現(xiàn)!但是想想,如果是初學(xué)者肯定不會(huì)不會(huì)問(wèn)這樣的問(wèn)題??隙ㄊ莻€(gè)高手,然后就開始上網(wǎng)查資料!然后發(fā)現(xiàn)真的可以實(shí)現(xiàn)!

說(shuō)起多繼承,首先大家可以想想這個(gè)問(wèn)題:你知道在C#中怎么實(shí)現(xiàn)多繼承嗎?

主流的答案無(wú)非2種。

答案一:用接口啊,一個(gè)類可以繼承自多個(gè)接口的。
答案二:C#不支持多繼承,C++才支持多繼承,多繼承會(huì)讓代碼變得很亂,因此微軟在設(shè)計(jì)C#的時(shí)候放棄了多繼承。

能夠知道答案二的人顯然懂的更多,我也在很長(zhǎng)一段時(shí)間內(nèi)相信C#不支持多繼承,直到2013年5月的一個(gè)項(xiàng)目中,我偶然的發(fā)現(xiàn)自己的代碼就完全實(shí)現(xiàn)了真正意義的多繼承。

先說(shuō)說(shuō)什么是真正意義的多繼承。真正的多繼承應(yīng)該是像C++那樣的,而不是說(shuō)像在C#里面一個(gè)類繼承了多個(gè)接口就叫多繼承。在C#中,如果一個(gè)類實(shí)現(xiàn)了多個(gè)接口,那么要為每個(gè)接口寫實(shí)現(xiàn),如果接口被多個(gè)類繼承,那么就會(huì)有重復(fù)的代碼,這顯然是無(wú)法接受的。

然而C++那樣的多繼承也確確實(shí)實(shí)給編碼帶來(lái)了很大的麻煩,我也相信微軟真的是因?yàn)橐庾R(shí)到了多繼承的不合理之處才在C#中擯棄了這個(gè)特性。而我在C#中實(shí)現(xiàn)的多繼承,第一是真正的多繼承,第二代碼寫的很合理。

請(qǐng)看案例

假如你有一個(gè)類叫老虎,還有一個(gè)類叫蒼蠅?,F(xiàn)在你想新創(chuàng)一個(gè)超級(jí)老虎類,一種可以飛的老虎。在C++中,你可以定義一種超級(jí)老虎類,讓其繼承自老虎和蒼蠅,這樣這種老虎就可以飛了。然而,問(wèn)題出現(xiàn)了,這種超級(jí)老虎由于同時(shí)也繼承自蒼蠅,而蒼蠅下面有個(gè)方法叫吃,參數(shù)類型是屎。吃屎的這個(gè)方法顯然跟我們的超級(jí)老虎太不搭了。

雖然這個(gè)例子有些夸張,但是很多C++程序員真的就是這樣在設(shè)計(jì)代碼。由于子類繼承了多個(gè)父類,而多個(gè)父類肯定有些成員跟這個(gè)子類不搭調(diào),于是子類的調(diào)用者就很難受了。比如上面這個(gè)例子,當(dāng)調(diào)用者拿到超級(jí)老虎的一個(gè)實(shí)例時(shí),發(fā)現(xiàn)超級(jí)老虎下面怎么會(huì)有個(gè)吃屎的方法呢?。?!真的是要笑死人了。

C++要這樣允許多繼承就必然會(huì)造成這個(gè)問(wèn)題。C#程序員就絕對(duì)不會(huì)寫出這樣滑稽的代碼。對(duì)于C#程序員,肯定是要把這個(gè)飛的方法提成接口的,然后讓蒼蠅類和超級(jí)老虎類都繼承自這個(gè)接口。這樣,蒼蠅會(huì)飛,超級(jí)老虎也會(huì)飛。是不是完美解決這個(gè)問(wèn)題?

問(wèn)題看上去解決了,但是,假如我跟你說(shuō)蒼蠅飛的方法跟超級(jí)老虎飛的方法需要一模一樣:首先張開雙翅,身體前傾,拍打雙翅,起飛,繼續(xù)拍打。我們肯定不能把同一份代碼copy一份吧,那是屬于入門級(jí)程序員干的事,我們現(xiàn)在已經(jīng)沒(méi)資格干那事了。那怎么辦呢?簡(jiǎn)單快速的做法是使用靜態(tài)方法,比如FlyHelper.Fly(...)。

靜態(tài)方法解決了代碼重用的問(wèn)題,但寫起來(lái)始終覺(jué)得哪里不對(duì)勁。我的超級(jí)老虎類和蒼蠅都明明繼承了飛了啊,為什么還要這樣調(diào)用一句靜態(tài)方法。如果以后哪天我想讓我的豬也能飛起來(lái),那豈不是還要來(lái)調(diào)用這個(gè)靜態(tài)方法。

到底怎樣才能在C#中實(shí)現(xiàn)像C++那樣優(yōu)雅的繼承呢?

答案揭曉

答案其實(shí)很簡(jiǎn)單,那就是給IFly接口寫擴(kuò)展方法。

首先請(qǐng)看這個(gè)空接口的定義,及其擴(kuò)展方法(注意泛型限制):

復(fù)制代碼 代碼如下:

namespace Interface
{
    //飛的接口
    public interface IFly
    {
    }
    //擴(kuò)展方法
    public static class ExtendFly
    {
        public static void StartFly<T>(this T example) where T : IFly
        {
            Console.WriteLine("準(zhǔn)備");
            Console.WriteLine("張開雙翅");
            Console.WriteLine("起飛");
            Console.WriteLine("我飛,我飛,我飛飛飛");
        }
    }
}

再看老虎和蒼蠅的實(shí)現(xiàn):

復(fù)制代碼 代碼如下:

namespace Interface
{
    //蒼蠅類實(shí)現(xiàn)飛的接口
    public class flies : IFly
    {
        public void fly()
        {
            //調(diào)用接口中飛的方法
            this.StartFly();
        }
    }
}
namespace Interface
{
    //老虎類
    public class Tiger
    {
        public void introduce()
        {
            Console.WriteLine("I am a tiger");
        }
    }
}

再看超級(jí)老虎的實(shí)現(xiàn):

復(fù)制代碼 代碼如下:

namespace Interface
{
    //超級(jí)老虎類,繼承了老虎類,并實(shí)現(xiàn)了飛的方法
    public class SuperTiger : Tiger, IFly
    {
        public override void introduce()
        {
            Console.WriteLine("大家好,我是超級(jí)老虎哦!");
        }

        public void TigerFly()
        {
            //調(diào)用接口中飛的方法
            this.StartFly();
        }
    }
}

怎么樣,你看明白了嗎?這個(gè)實(shí)現(xiàn)是不是很簡(jiǎn)單呢?好處是不是大大的有呢?

當(dāng)以后哪天老板讓你實(shí)現(xiàn)一個(gè)會(huì)飛的超級(jí)豬的話,你只需要讓你的超級(jí)豬繼承“I飛”接口就行了。當(dāng)哪天老板又不想要這個(gè)超級(jí)豬飛的話,你也只需要將這個(gè)接口繼承刪掉而已。如果你正在開發(fā)一個(gè)動(dòng)物王國(guó)程序,你可以將飛的功能注入到任何一種動(dòng)物身上。想想是不是都覺(jué)得很爽。

總結(jié)

最后,再讓我們回顧一下之前用C++寫的超級(jí)老虎吃屎的變態(tài)例子。這實(shí)際上不是C++的錯(cuò),而是程序員用錯(cuò)了多繼承。雖然在語(yǔ)法上C++沒(méi)有限制程序員怎么去寫多繼承,但是從上面的例子分析來(lái)看,我們很容得出這樣一個(gè)結(jié)論:

當(dāng)需要寫多繼承的時(shí)候,被繼承的父類只能是一個(gè)功能,而不應(yīng)是一個(gè)完整的類。

如果按照這個(gè)思路,那么今天的這個(gè)例子在C++中就可以這樣寫,首先提一個(gè)Flyable的類出來(lái),然后讓超級(jí)老虎和蒼蠅都繼承這個(gè)Flyable。

在C#中,雖然實(shí)現(xiàn)多繼承的代碼稍微繞了個(gè)彎,但是多繼承帶來(lái)的好處是非常明顯的:對(duì)不同的類實(shí)現(xiàn)注入式的功能,讓你的代碼更符合面向?qū)ο蟮乃枷搿?/p>

相關(guān)文章

  • C#中static的詳細(xì)用法實(shí)例

    C#中static的詳細(xì)用法實(shí)例

    在C#中所有方法都必須在一個(gè)類的內(nèi)部聲明,然而如果把一個(gè)方法或字段聲明為Static,就可以使用類名來(lái)調(diào)用方法或訪問(wèn)字段,下面這篇文章主要給大家介紹了關(guān)于C#中static詳細(xì)用法的相關(guān)資料,需要的朋友可以參考下
    2022-12-12
  • C#中datagridview使用tooltip控件顯示單元格內(nèi)容的方法

    C#中datagridview使用tooltip控件顯示單元格內(nèi)容的方法

    這篇文章主要介紹了C#中datagridview使用tooltip控件顯示單元格內(nèi)容的方法,實(shí)例分析了C#控件的相關(guān)使用技巧,需要的朋友可以參考下
    2016-06-06
  • C#實(shí)現(xiàn)屬于自己的QQ截圖工具

    C#實(shí)現(xiàn)屬于自己的QQ截圖工具

    這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)屬于自己的QQ截圖工具的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-04-04
  • C#獲取串口列表實(shí)現(xiàn)實(shí)時(shí)監(jiān)控串口

    C#獲取串口列表實(shí)現(xiàn)實(shí)時(shí)監(jiān)控串口

    本文主要介紹兩種獲取串口列表的方法,比較簡(jiǎn)單,方便大家使用,另外分享了一個(gè)已封裝的API,需要的朋友可以參考下。
    2016-05-05
  • 深入理解C#中常見(jiàn)的委托

    深入理解C#中常見(jiàn)的委托

    這篇文章主要介紹了C# 委托(Delegate)的相關(guān)資料,文中講解非常詳細(xì),代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下,希望能夠幫助到你
    2021-07-07
  • C#微信公眾號(hào)開發(fā)之接收事件推送與消息排重的方法

    C#微信公眾號(hào)開發(fā)之接收事件推送與消息排重的方法

    這篇文章主要介紹了C#微信公眾號(hào)開發(fā)之接收事件推送與消息排重的方法,詳細(xì)分析了事件推送與消息排重的使用技巧,對(duì)微信開發(fā)有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-01-01
  • C#中的多線程小試牛刀

    C#中的多線程小試牛刀

    這篇文章主要給大家介紹了關(guān)于C#中多線程的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C#具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • WPF實(shí)現(xiàn)倒計(jì)時(shí)轉(zhuǎn)場(chǎng)動(dòng)畫效果

    WPF實(shí)現(xiàn)倒計(jì)時(shí)轉(zhuǎn)場(chǎng)動(dòng)畫效果

    這篇文章主要介紹了如何利用WPF實(shí)現(xiàn)倒計(jì)時(shí)轉(zhuǎn)場(chǎng)動(dòng)畫效果,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)或工作有一定幫助,需要的可以參考一下
    2022-08-08
  • c# 網(wǎng)址壓縮簡(jiǎn)單實(shí)現(xiàn)短網(wǎng)址

    c# 網(wǎng)址壓縮簡(jiǎn)單實(shí)現(xiàn)短網(wǎng)址

    短網(wǎng)址,忽然一下子就冒出來(lái)的東西,長(zhǎng)長(zhǎng)的一個(gè)URL,提交過(guò)去,出來(lái)就只有短短的一個(gè)URL了,看起來(lái)似乎挺神奇,其實(shí)簡(jiǎn)單分析一下,明白其中的原理,也是一件很簡(jiǎn)單的事情,需要的朋友可以了解下
    2012-12-12
  • 詳解C# FileStream類

    詳解C# FileStream類

    這篇文章主要介紹了詳解C# FileStream類的相關(guān)知識(shí),文中講解的非常細(xì)致,代碼供大家參考和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06

最新評(píng)論