免费观看又色又爽又黄的小说免费_美女福利视频国产片_亚洲欧美精品_美国一级大黄大色毛片

深入淺出OOP(一):多態(tài)和繼承(早期綁定/編譯時(shí)多態(tài))-創(chuàng)新互聯(lián)

在本系列中,我們以CodeProject上比較火的OOP系列博客為主,進(jìn)行OOP深入淺出展現(xiàn)。

創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比連山網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式連山網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋連山地區(qū)。費(fèi)用合理售后完善,10多年實(shí)體公司更值得信賴。

無論作為軟件設(shè)計(jì)的高手、或者菜鳥,對(duì)于架構(gòu)設(shè)計(jì)而言,均需要多次重構(gòu)、取舍,以有利于整個(gè)軟件項(xiàng)目的健康構(gòu)建,有些經(jīng)驗(yàn)是前輩總結(jié)的,我們拿來使用即可,有些是團(tuán)隊(duì)知識(shí)沉淀的,總之復(fù)用前人好的思想有利于減少返工。當(dāng)然,在面試的時(shí)候,如果能圍繞OOP大談特談,自然會(huì)加分多多的。

開始閱讀本系列博客的預(yù)備知識(shí),多態(tài)、封裝、面向?qū)ο缶幊痰龋?qǐng)通過MSDN學(xué)習(xí)。如下圖的術(shù)語,您應(yīng)該耳熟能詳?shù)摹1鞠盗形恼率褂肅#作為唯一腳本語言。

深入淺出OOP(一): 多態(tài)和繼承(早期綁定/編譯時(shí)多態(tài))

OOP

1 是什么OOP,以及OOP的優(yōu)勢(shì)是什么?

OOP代表的是面向?qū)ο缶幊蹋∣bject-Oriented Programming),它基于對(duì)象的整體進(jìn)行編程,取代了基于過程函數(shù)的編程思想。具體實(shí)現(xiàn)是圍繞對(duì)象進(jìn)行數(shù)據(jù)、函數(shù)封裝,而不是基于邏輯關(guān)系。OOP中的對(duì)象直達(dá)的是一個(gè)特定的類型、或者某類型的實(shí)例對(duì)象、更多時(shí)候是一個(gè)class。每個(gè)class對(duì)象的結(jié)構(gòu)基本相似,但是有各自特有的屬性和數(shù)據(jù)值。對(duì)象之間可通過對(duì)外的接口進(jìn)行訪問:方法、屬性等。基于OOP的這些優(yōu)勢(shì),獨(dú)立的對(duì)象可以修改而不會(huì)影響到其他對(duì)象,這樣會(huì)比較方便的升級(jí)軟件減少潛在的bug。軟件系統(tǒng)隨著時(shí)間的推移,會(huì)變得越來越大,OOP編程思想有效的提高了系統(tǒng)代碼的可讀性和管理性。

深入淺出OOP(一): 多態(tài)和繼承(早期綁定/編譯時(shí)多態(tài))

2 OOP的概念是什么?

下面用5個(gè)術(shù)語來說明OOP的具體概念是什么:

  • 數(shù)據(jù)抽象(Data Abstraction):數(shù)據(jù)抽象是對(duì)需要操作的物體進(jìn)行建模的出發(fā)點(diǎn),既對(duì)使用對(duì)象進(jìn)行了抽象,隱藏了內(nèi)部的細(xì)節(jié)(對(duì)使用的最終用戶而言)。用戶可以非常方便的使用class的方法、數(shù)據(jù),而不用關(guān)心數(shù)據(jù)創(chuàng)建、運(yùn)行邏輯的背后復(fù)雜的過程。我們以真實(shí)世界為例,當(dāng)你騎一輛自行車的時(shí)候,不用考慮變速齒輪的原理如何驅(qū)動(dòng)鏈條、車輪吧。

  • 繼承(Inheritance):繼承是OOP概念中最流行的一個(gè)概念。繼承給程序員提供了可復(fù)用代碼的優(yōu)勢(shì)。基類定義好函數(shù)邏輯,子類通過繼承,可實(shí)現(xiàn)直接訪問--就想子類自身的方法一樣方便。

  • 數(shù)據(jù)封裝(Data Encapsulation):對(duì)class的成員變量、成員函數(shù)通過訪問控制符進(jìn)行包裝,則稱為數(shù)據(jù)封裝。訪問控制符有public、Protected、Private、Internal 4種類型。

  • 多態(tài)(Polymorphism):對(duì)象可通過傳遞不同參數(shù)實(shí)現(xiàn)相同的動(dòng)作,這種行為我們稱之為多態(tài)。我們以真實(shí)世界為例,“開車”這個(gè)方法,對(duì)不同類型的用戶要提供不同的參數(shù)實(shí)現(xiàn)多態(tài),如Car.Drive(Man), Car.Drive(Woman)等。

  • 消息通信(Message Communication):消息通信意味著通過通過消息進(jìn)行class函數(shù)的調(diào)用、執(zhí)行。

3 多態(tài)(Polymorphism)

在本節(jié),我們分別用代碼片段來闡述各自類型的多態(tài)類型:函數(shù)重載、早期綁定、編譯器的多態(tài)。

先創(chuàng)建一個(gè)console 工程,并命名為InheritanceAndPolymorphism,然后添加類Overload.cs,再添加DisplayOverload函數(shù)。

public class Overload
    {        public void DisplayOverload(int a){
            System.Console.WriteLine("DisplayOverload " + a);
        }        public void DisplayOverload(string a){
            System.Console.WriteLine("DisplayOverload " + a);
        }        public void DisplayOverload(string a, int b){
            System.Console.WriteLine("DisplayOverload " + a + b);
        }
    }

Program.cs添加如下代碼:

class Program
    {        static void Main(string[] args)
        {
            Overload overload = new Overload();
            overload.DisplayOverload(100);
            overload.DisplayOverload("method overloading");
            overload.DisplayOverload("method overloading", 100);
            Console.ReadKey();

運(yùn)行程序,結(jié)果如下:

DisplayOverload 100
DisplayOverload method overloading
DisplayOverload method overloading100

Overload類中的DisplayOverload提供了3類不同的重載函數(shù):方法名相同,參數(shù)類型和個(gè)數(shù)不同。C#中的這種方式成為重載,既我們不需要為每類函數(shù)定義不同名字的函數(shù),僅需要改變函數(shù)參數(shù)類型和個(gè)數(shù)即可實(shí)現(xiàn),這個(gè)也成為函數(shù)簽名。

用不同的返回值可以否? 我們?cè)囋囅旅娴拇a:

public void DisplayOverload() { }public int DisplayOverload(){ }

肯定的結(jié)果是,Visual Studio會(huì)給予如下的報(bào)錯(cuò)信息:

Error: Type 'InheritanceAndPolymorphism.Overload' already defines a member called 'DisplayOverload' with the same parameter types

從上面的結(jié)果可知:返回值不作為多態(tài)函數(shù)簽名。

我們?cè)龠\(yùn)行如下的代碼:

static void DisplayOverload(int a)  {   }public void DisplayOverload(int a) {   }public void DisplayOverload(string a){  }

結(jié)果依然是報(bào)錯(cuò):

Error: Type 'InheritanceAndPolymorphism.Overload' already defines a member called 'DisplayOverload' with the same parameter types

結(jié)論:static的可見函數(shù)修飾符不作為重載簽名。

運(yùn)行下面的代碼,試試out、ref可否作為重載簽名。

private void DisplayOverload(int a) {   }private void DisplayOverload(out int a)
        {
            a = 100;
        }private void DisplayOverload(ref int a) {   }

結(jié)果是如下的報(bào)錯(cuò):

Error: Cannot define overloaded method 'DisplayOverload' because it differs from another method only on ref and out

結(jié)論:ref、out傳遞參數(shù)修飾符也不能作為重載簽名。

4 多態(tài)中Params 參數(shù)的作用

一個(gè)函數(shù)可包含如下4種類型的參數(shù)傳遞:

  • 值傳遞 (pass by value)

  • 引用傳遞 (Pass by reference)

  • 作為output參數(shù) (As an output parameter)

  • 使用參數(shù)數(shù)組 (Using parameter arrays)

我們運(yùn)行如下代碼:

public void DisplayOverload(int a, string a)  {   }        public void Display(int a)
        {            string a;
        }

不出意外,獲得如下報(bào)錯(cuò)信息:

Error1: The parameter name 'a' is a duplicate

Error2: A local variable named 'a' cannot be declared in this scope because it would give a different meaning to 'a', which is already used in a 'parent or current' scope to denote something else

在相同的作用域中,參數(shù)名稱必須是唯一的。

在Overload.cs文件中,添加如下代碼:

public class Overload
    {        private string name = "Akhil";        public void Display()
        {
            Display2(ref name, ref name);
            System.Console.WriteLine(name);
        }        private void Display2(ref string x, ref string y)
        {
            System.Console.WriteLine(name);
            x = "Akhil 1";
            System.Console.WriteLine(name);
            y = "Akhil 2";
            System.Console.WriteLine(name);
            name = "Akhil 3";
        }
    }

在Program.cs中添加如下代碼:

class Program
    {        static void Main(string[] args)
        {
            Overload overload = new Overload();
            overload.Display();
            Console.ReadKey();
        }
    }

運(yùn)行結(jié)果如下:

Akhil
Akhil 1
Akhil 2
Akhil3

深入淺出OOP(一): 多態(tài)和繼承(早期綁定/編譯時(shí)多態(tài))

結(jié)論:我們通過ref引用傳遞了name的內(nèi)存地址,故修改x、y的值相當(dāng)于直接修改name的值,故結(jié)果運(yùn)行如上。

下面這段代碼演示了params關(guān)鍵字的作用:

在Overload.cs文件添加如下代碼:

public class Overload
    {        public void Display()
        {
            DisplayOverload(100, "Akhil", "Mittal", "OOP");
            DisplayOverload(200, "Akhil");
            DisplayOverload(300);
        }        private void DisplayOverload(int a, params string[] parameterArray)
        {            foreach (string str in parameterArray)
               Console.WriteLine(str + " " + a);
        }
    }

在Program.cs文件添加如下代碼:

class Program
    {        static void Main(string[] args)
        {
            Overload overload = new Overload();
            overload.Display();
            Console.ReadKey();
        }
    }

運(yùn)行結(jié)果如下:

Akhil 100
Mittal 100
OOP 100
Akhil 200

C#提供了params動(dòng)態(tài)參數(shù)數(shù)組機(jī)制,非常方便的在運(yùn)行時(shí)動(dòng)態(tài)傳遞不同數(shù)量的同類型參數(shù)。

注:params關(guān)鍵詞僅能作為函數(shù)的最后一個(gè)參數(shù)適用。

我們?cè)僭囋噋arams關(guān)鍵字的函數(shù)簽名和非params關(guān)鍵字函數(shù)簽名的優(yōu)先級(jí)順序:

public class Overload
    {        public void Display()
        {
            DisplayOverload(200);
            DisplayOverload(200, 300);
            DisplayOverload(200, 300, 500, 600);
        }        private void DisplayOverload(int x, int y)
        {
            Console.WriteLine("The two integers " + x + " " + y);
        }        private void DisplayOverload(params int[] parameterArray)
        {
            Console.WriteLine("parameterArray");
        }

    }

Program.cs文件添加如下代碼:

class Program
    {        static void Main(string[] args)
        {
            Overload overload = new Overload();
            overload.Display();
            Console.ReadKey();
        }
    }

運(yùn)行結(jié)果如下:

parameterArray
The two integers 200 300
parameterArray

從運(yùn)行結(jié)果看,C#非常巧妙的進(jìn)行非params函數(shù)的精準(zhǔn)匹配優(yōu)先,如1個(gè)int類型\3個(gè)int類型,則用params類型匹配;2個(gè)int類型,用明確定義的函數(shù)進(jìn)行匹配。

5 結(jié)論

深入淺出OOP(一): 多態(tài)和繼承(早期綁定/編譯時(shí)多態(tài))

在本節(jié)中,我們進(jìn)行OOP系列的第一篇,主要說明了編譯器的多態(tài),它也稱為早期綁定或者方法重載。同時(shí),我們也學(xué)習(xí)C#中威力強(qiáng)大的params關(guān)鍵字,并用它來實(shí)現(xiàn)多態(tài)。

本文要點(diǎn)歸納如下:

  • C#函數(shù)重載的簽名規(guī)則是用參數(shù)的類型和數(shù)量判斷,而不是函數(shù)的名字。

  • 函數(shù)返回值不作為重載簽名。

  • 修飾符不作為簽名的一部分,如static

  • 同函數(shù)中,多個(gè)參數(shù)名稱要唯一

  • ref、out是引用傳遞,傳遞的是參數(shù)的內(nèi)存地址

  • params 作為參數(shù)關(guān)鍵詞,僅能用于函數(shù)的最后一個(gè)參數(shù)

原文地址:http://www.codeproject.com/Articles/771455/Diving-in-OOP-Day-Polymorphism-and-Inheritance-Ear

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

分享標(biāo)題:深入淺出OOP(一):多態(tài)和繼承(早期綁定/編譯時(shí)多態(tài))-創(chuàng)新互聯(lián)
網(wǎng)站網(wǎng)址:http://m.newbst.com/article10/coeego.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供小程序開發(fā)搜索引擎優(yōu)化網(wǎng)站收錄網(wǎng)站設(shè)計(jì)企業(yè)網(wǎng)站制作網(wǎng)站維護(hù)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)