亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

C#中實現多繼承的方法

2020-01-24 02:27:44
字體:
來源:轉載
供稿:網友

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

說起多繼承,首先大家可以想想這個問題:你知道在C#中怎么實現多繼承嗎?

主流的答案無非2種。

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

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

先說說什么是真正意義的多繼承。真正的多繼承應該是像C++那樣的,而不是說像在C#里面一個類繼承了多個接口就叫多繼承。在C#中,如果一個類實現了多個接口,那么要為每個接口寫實現,如果接口被多個類繼承,那么就會有重復的代碼,這顯然是無法接受的。

然而C++那樣的多繼承也確確實實給編碼帶來了很大的麻煩,我也相信微軟真的是因為意識到了多繼承的不合理之處才在C#中擯棄了這個特性。而我在C#中實現的多繼承,第一是真正的多繼承,第二代碼寫的很合理。

請看案例

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

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

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

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

靜態方法解決了代碼重用的問題,但寫起來始終覺得哪里不對勁。我的超級老虎類和蒼蠅都明明繼承了飛了啊,為什么還要這樣調用一句靜態方法。如果以后哪天我想讓我的豬也能飛起來,那豈不是還要來調用這個靜態方法。

到底怎樣才能在C#中實現像C++那樣優雅的繼承呢?

答案揭曉

答案其實很簡單,那就是給IFly接口寫擴展方法。

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

復制代碼 代碼如下:

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

再看老虎和蒼蠅的實現:

復制代碼 代碼如下:

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

再看超級老虎的實現:

復制代碼 代碼如下:

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

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

怎么樣,你看明白了嗎?這個實現是不是很簡單呢?好處是不是大大的有呢?

當以后哪天老板讓你實現一個會飛的超級豬的話,你只需要讓你的超級豬繼承“I飛”接口就行了。當哪天老板又不想要這個超級豬飛的話,你也只需要將這個接口繼承刪掉而已。如果你正在開發一個動物王國程序,你可以將飛的功能注入到任何一種動物身上。想想是不是都覺得很爽。

總結

最后,再讓我們回顧一下之前用C++寫的超級老虎吃屎的變態例子。這實際上不是C++的錯,而是程序員用錯了多繼承。雖然在語法上C++沒有限制程序員怎么去寫多繼承,但是從上面的例子分析來看,我們很容得出這樣一個結論:

當需要寫多繼承的時候,被繼承的父類只能是一個功能,而不應是一個完整的類。

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

在C#中,雖然實現多繼承的代碼稍微繞了個彎,但是多繼承帶來的好處是非常明顯的:對不同的類實現注入式的功能,讓你的代碼更符合面向對象的思想。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久精品免费播放| 亚洲欧美中文日韩在线| 欧美性猛交xxxx久久久| 日韩美女视频在线观看| 国产成人在线精品| 中文字幕日韩专区| 日韩欧美中文字幕在线播放| 久久国产精品影视| 成人免费在线视频网址| 国产偷亚洲偷欧美偷精品| 久久精品91久久香蕉加勒比| 精品一区二区三区三区| 成人乱色短篇合集| 亚洲乱亚洲乱妇无码| 久久久久亚洲精品国产| 97成人精品区在线播放| 国产精品va在线播放| 久久久精品视频成人| 国产美女直播视频一区| 国产欧美日韩精品丝袜高跟鞋| 亚洲高清久久网| 日韩在线视频观看| 一区二区三区视频免费| 国产精品一区二区三区毛片淫片| 国产精品自产拍在线观看中文| 日韩欧亚中文在线| 成人欧美一区二区三区黑人孕妇| 欧美国产极速在线| 亚洲护士老师的毛茸茸最新章节| 国产精品丝袜久久久久久不卡| 国产精品视频久久| 欧美日韩另类在线| 97色在线视频| 亚洲天堂av在线免费| 亚洲人高潮女人毛茸茸| 亚洲天堂成人在线视频| 欧美性xxxxxxxxx| 日韩经典第一页| 亚洲欧美日韩成人| 97成人在线视频| 久久91精品国产91久久跳| 日韩视频一区在线| 久久成人这里只有精品| 96精品久久久久中文字幕| 欧美激情一区二区三区久久久| 欧美wwwwww| 国产精品久久久久久av福利软件| 日韩亚洲综合在线| 欧美激情一区二区三级高清视频| 97在线视频观看| 在线看福利67194| 国产精品1234| 亚洲第一页在线| 久久精品国产96久久久香蕉| 精品精品国产国产自在线| 夜夜嗨av一区二区三区免费区| 国产福利精品在线| 欧美黄色免费网站| 欧美电影免费观看高清| 亚洲综合av影视| 日韩av不卡在线| 国产精品久久久久久久久久久久久久| 欧美精品中文字幕一区| 亚洲人高潮女人毛茸茸| 成人黄色片在线| 91精品国产高清自在线看超| 91高清在线免费观看| 日韩国产欧美精品在线| 久久精品91久久久久久再现| 欧美午夜女人视频在线| 亚洲石原莉奈一区二区在线观看| 亚洲午夜精品视频| 91精品久久久久久久久久入口| 久久久久久免费精品| 欧美丰满少妇xxxxx| 日韩欧美极品在线观看| 欧美性高跟鞋xxxxhd| 另类美女黄大片| 日韩精品久久久久| 欧美电影第一页| 久久久999精品| 久久天天躁狠狠躁夜夜av| 国产成人精品久久| 精品日韩美女的视频高清| 亚洲欧洲成视频免费观看| 68精品国产免费久久久久久婷婷| 欧美与欧洲交xxxx免费观看| y97精品国产97久久久久久| 亚洲韩国青草视频| 欧美有码在线观看| 欧美日韩精品在线| 国产成人高清激情视频在线观看| 亚洲男人的天堂网站| 中文字幕免费精品一区高清| 懂色aⅴ精品一区二区三区蜜月| 欧美亚洲日本黄色| 欧美激情a∨在线视频播放| 国产一区二区香蕉| 成人精品网站在线观看| 国内揄拍国内精品少妇国语| 51ⅴ精品国产91久久久久久| 欧美最猛性xxxxx免费| 精品国产91乱高清在线观看| 日韩av免费观影| 亚洲伊人成综合成人网| 日韩黄色在线免费观看| 欧美性猛交xxxx免费看久久久| 欧美性xxxxxxxxx| 欧美精品制服第一页| 2019av中文字幕| 国产精品美女av| 国产视频精品va久久久久久| 亚洲美女av黄| 亚洲天堂网站在线观看视频| 欧美极品少妇与黑人| 色偷偷av一区二区三区乱| 中文字幕少妇一区二区三区| 国产精品精品一区二区三区午夜版| 久久九九免费视频| 久久97久久97精品免视看| 精品久久久在线观看| 欧美黑人xxxx| 久久久久久免费精品| 久久激情五月丁香伊人| 国产不卡av在线免费观看| 美女少妇精品视频| 亚洲色图校园春色| 久久成人人人人精品欧| 久久亚洲精品毛片| 国产精品777| 青青草一区二区| 中文字幕国产亚洲2019| 国产精品福利在线观看网址| 永久免费精品影视网站| 亚洲男人7777| 国产欧美日韩中文字幕在线| 欧美日韩在线视频一区二区| 亚洲成人在线视频播放| 国产精品18久久久久久麻辣| 国产热re99久久6国产精品| 久久国产视频网站| 在线视频中文亚洲| 亚洲视频电影图片偷拍一区| 欧美性20hd另类| 色婷婷av一区二区三区在线观看| 成人av番号网| 亚洲另类激情图| 欧美黑人极品猛少妇色xxxxx| 日韩视频免费中文字幕| 国产欧美一区二区三区在线看| 欧美大片在线免费观看| 久久高清视频免费| www.午夜精品| 欧美日韩成人免费| 欧美国产亚洲精品久久久8v| 久久久久久欧美| 日韩精品在线视频美女| 欧美日韩国产中文字幕| 欧美在线视频a| 中文字幕久久亚洲| 992tv成人免费视频| 国产视频999| 亚洲一区二区久久| 日韩综合视频在线观看|