亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C#中的多態(tài)深入理解

 更新時間:2014年01月20日 09:49:15   作者:  
如果面試時主考官要求你用一句話來描述多態(tài),盡可能的精煉,你會怎么回答?當然答案有很多,每個人的理解和表達不盡相同,但我比較趨向這樣描述:通過繼承實現(xiàn)的不同對象調用相同的方法,表現(xiàn)出不同的行為,稱之為多態(tài)

封裝、繼承、多態(tài),面向對象的三大特性,前兩項理解相對容易,但要理解多態(tài),特別是深入的了解,對于初學者而言可能就會有一定困難了。我一直認為學習OO的最好方法就是結合實踐,封裝、繼承在實際工作中的應用隨處可見,但多態(tài)呢?也許未必,可能不經(jīng)意間用到也不會把它跟“多態(tài)”這個詞對應起來。在此拋磚引玉,大家討論,個人能力有限,不足之處還請指正。

之前看到過類似的問題:如果面試時主考官要求你用一句話來描述多態(tài),盡可能的精煉,你會怎么回答?當然答案有很多,每個人的理解和表達不盡相同,但我比較趨向這樣描述:通過繼承實現(xiàn)的不同對象調用相同的方法,表現(xiàn)出不同的行為,稱之為多態(tài)。

例1:

復制代碼 代碼如下:

public class Animal
    {
        public virtual void Eat()
        {
            Console.WriteLine("Animal eat");
        }
    }

    public class Cat : Animal
    {
        public override void Eat()
        {
            Console.WriteLine("Cat eat");
        }
    }

    public class Dog : Animal
    {
        public override void Eat()
        {
            Console.WriteLine("Dog eat");
        }
    }

    class Tester
    {
        static void Main(string[] args)
        {
            Animal[] animals = new Animal[3];

            animals[0] = new Animal();
            animals[1] = new Cat();
            animals[2] = new Dog();

            for (int i = 0; i < 3; i++)
            {
                animals[i].Eat();
            }
        }
    }


輸出如下:
Animal eat...
Cat eat...
Dog eat...

在上面的例子中,通過繼承,使得Animal對象數(shù)組中的不同的對象,在調用Eat()方法時,表現(xiàn)出了不同的行為。

多態(tài)的實現(xiàn)看起來很簡單,要完全理解及靈活的運用c#的多態(tài)機制,也不是一件容易的事,有很多需要注意的地方。

1. new的用法
先看下面的例子。

例2:

復制代碼 代碼如下:

public class Animal
    {
        public virtual void Eat()
        {
            Console.WriteLine("Animal eat");
        }
    }

    public class Cat : Animal
    {
        public new void Eat()
        {
            Console.WriteLine("Cat eat");
        }
    }

    class Tester
    {
        static void Main(string[] args)
        {
            Animal a = new Animal();
            a.Eat();

            Animal ac = new Cat();
            ac.Eat();

            Cat c = new Cat();
            c.Eat();
        }
    }


運行結果為:
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()方法,編譯器會輸出警告)。

我想這是設計者有意這么設計的,因為有時候我們就是要達到這種效果。嚴格的說,不能說通過使用new來實現(xiàn)多態(tài),只能說在某些特定的時候碰巧實現(xiàn)了多態(tài)的效果。

2.override實現(xiàn)多態(tài)
真正的多態(tài)使用override來實現(xiàn)的?;剡^去看前面的例1,在基類Animal中將方法Eat()用virtual標記為虛擬方法,再在派生類Cat和Dog中用override對Eat()修飾,進行重寫,很簡單就實現(xiàn)了多態(tài)。需要注意的是,要對一個類中一個方法用override修飾,該類必須從父類中繼承了一個對應的用virtual修飾的虛擬方法,否則編譯器將報錯。

好像講得差不多了,還有一個問題,不知道你想沒有。就是多層繼承中又是怎樣實現(xiàn)多態(tài)的。比如類A是基類,有一個虛擬方法method()(virtual修飾),類B繼承自類A,并對method()進行重寫(override修飾),現(xiàn)在類C又繼承自類B,是不是可以繼續(xù)對method()進行重寫,并實現(xiàn)多態(tài)呢?看下面的例子。

例3:

復制代碼 代碼如下:

public class Animal
    {
        public virtual void Eat()
        {
            Console.WriteLine("Animal eat");
        }
    }

    public class Dog : Animal
    {
        public override void Eat()
        {
            Console.WriteLine("Dog eat");
        }
    }

    public class WolfDog : Dog
    {
        public override void Eat()
        {
            Console.WriteLine("WolfDog eat");
        }
    }

    class Tester
    {
        static void Main(string[] args)
        {
            Animal[] animals = new Animal[3];

            animals[0] = new Animal();
            animals[1] = new Dog();
            animals[2] = new WolfDog();

            for (int i = 0; i < 3; i++)
            {
                animals[i].Eat();
            }
        }
}


運行結果為:
Animal eat...
Dog eat...
WolfDog eat...

在上面的例子中類Dog繼承自類Animal,對方法Eat()進行了重寫,類WolfDog又繼承自Dog,再一次對Eat()方法進行了重寫,并很好地實現(xiàn)了多態(tài)。不管繼承了多少層,都可以在子類中對父類中已經(jīng)重寫的方法繼續(xù)進行重寫,即如果父類方法用override修飾,如果子類繼承了該方法,也可以用override修飾,多層繼承中的多態(tài)就是這樣實現(xiàn)的。要想終止這種重寫,只需重寫方法時用sealed關鍵字進行修飾即可。

3. abstract-override實現(xiàn)多態(tài)
先在我們在來討論一下用abstract修飾的抽象方法。抽象方法只是對方法進行了定義,而沒有實現(xiàn),如果一個類包含了抽象方法,那么該類也必須用abstract聲明為抽象類,一個抽象類是不能被實例化的。對于類中的抽象方法,可以再其派生類中用override進行重寫,如果不重寫,其派生類也要被聲明為抽象類??聪旅娴睦印?/P>

例4:

復制代碼 代碼如下:

public abstract class Animal
    {
      public abstract void Eat();
    }

    public class Cat : Animal
    {
        public override void Eat()
        {
            Console.WriteLine("Cat eat");
        }
    }

    public class Dog : Animal
    {
        public override void Eat()
        {
            Console.WriteLine("Dog eat");
        }
    }

    public class WolfDog : Dog
    {
        public override void Eat()
        {
            Console.WriteLine("Wolfdog eat");
        }
    }

    class Tester
    {
        static void Main(string[] args)
        {
            Animal[] animals = new Animal[3];

            animals[0] = new Cat();
            animals[1] = new Dog();
            animals[2] = new WolfDog();

            for (int i = 0; i < animals.Length; i++)
            {
                animals[i].Eat();
            }
        }
    }


運行結果為:
Cat eat...
Dog eat...
Wolfdog eat...

從上面可以看出,通過使用abstract-override可以和virtual-override一樣地實現(xiàn)多態(tài),包括多層繼承也是一樣的。不同之處在于,包含虛擬方法的類可以被實例化,而包含抽象方法的類不能被實例化。

以上就是我對c#中多態(tài)的一些淺薄的認識,如有錯誤的地方,歡迎批評指正!

相關文章

  • C# OpenCvSharp實現(xiàn)去除字母后面的雜線

    C# OpenCvSharp實現(xiàn)去除字母后面的雜線

    這篇文章主要為大家詳細介紹了C#如何使用OpenCvSharp實現(xiàn)去除字母后面的雜線效果,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-11-11
  • C#?winform跨線程操作控件的實現(xiàn)

    C#?winform跨線程操作控件的實現(xiàn)

    本文主要介紹了C#?winform跨線程操作控件的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-06-06
  • c# 備忘錄模式

    c# 備忘錄模式

    備忘錄模式:在不破壞封裝的前提下,捕獲一個對象的內部狀態(tài),并在這個對象之外的地方保存這個狀態(tài),這樣以后就可將該對象恢復到原來保存的狀態(tài)了
    2012-10-10
  • C#從數(shù)據(jù)庫讀取圖片并保存的兩種方法

    C#從數(shù)據(jù)庫讀取圖片并保存的兩種方法

    這篇文章主要介紹了C#從數(shù)據(jù)庫讀取圖片并保存的方法,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下
    2021-01-01
  • C#列表List<T>、HashSet和只讀集合介紹

    C#列表List<T>、HashSet和只讀集合介紹

    這篇文章介紹了C#中的列表List<T>、HashSet和只讀集合,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05
  • DevExpress設置TreeList圖片節(jié)點背景色的方法

    DevExpress設置TreeList圖片節(jié)點背景色的方法

    這篇文章主要介紹了DevExpress設置TreeList圖片節(jié)點背景色的方法,需要的朋友可以參考下
    2014-08-08
  • Unity游戲開發(fā)之炸彈人游戲的實現(xiàn)

    Unity游戲開發(fā)之炸彈人游戲的實現(xiàn)

    大家小時候肯定玩過這款游戲,炸彈人也算是經(jīng)典中的經(jīng)典啦。本文將利用Unity模擬實現(xiàn)這一經(jīng)典游戲,感興趣的小伙伴可以跟隨小編一起學習一下
    2022-03-03
  • Unity UGUI的ScrollRect滾動視圖組件使用詳解

    Unity UGUI的ScrollRect滾動視圖組件使用詳解

    這篇文章主要為大家介紹了Unity UGUI的ScrollRect滾動視圖組件使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • C#面向對象編程中接口隔離原則的示例詳解

    C#面向對象編程中接口隔離原則的示例詳解

    在面向對象編程中,SOLID?是五個設計原則的首字母縮寫,旨在使軟件設計更易于理解、靈活和可維護。本文將通過實例詳細講講C#面向對象編程中接口隔離原則,需要的可以參考一下
    2022-07-07
  • C#圖表算法之最短路徑

    C#圖表算法之最短路徑

    本文詳細講解了C#圖表算法之最短路徑,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-04-04

最新評論