国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

C#中面向對象編程機制之多態學習筆記

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

C#的多態性:

我的理解是:同一個操作,作用于不同的對象時,會有不同的結果,即同一個方法根據需要,作用于不同的對象時,會有不同的實現。

C#的多態包括:接口多態,繼承多態。

其中繼承多態又包括通過虛擬方法實現的多態和通過抽象方法實現的多態性

例如:基類動物都有吃的方法,但是不同的動物吃的東西就會不一樣,例如狼吃肉,羊吃草,這樣“吃”的這個方法就要在派生類里面重新實現以下,運行時,通過指向基類的指針,來調用實現派生類中的方法。

接下來舉例實現多態性。

1. 接口多態性

把動物“吃”的方法放到一個接口(IAnimal)里,然后讓具體的動物類(Wolf/Sheep)繼承這個接口,并根據自己的需要實現這個接口。

代碼實現:

復制代碼 代碼如下:

class Program {
        static void Main(string[] args) {
            new Wolf().Eat();
            new Sheep().Eat();
        }
    }

    public class Wolf : IAnimal {
        //多態實現
        public void Eat() {
            Console.WriteLine("狼吃肉!");
        }
    }

    public class Sheep : IAnimal {
        //多態實現
        public void Eat() {
            Console.WriteLine("羊吃草!");
        }
    }

    //接口
    public interface IAnimal {
        void Eat();
    }

接口的多態性就是當不同的類繼承了相同的接口以后,都要根據自己的需要重新實現繼承的接口,這樣同樣的方法簽名在不同的類中就會實現不同的操作。

2. 繼承的多態性

2.1.通過虛擬方法實現的多態(virtual,override)

   首先要在基類中實現virtual方法,然后在派生類中根據自己的需要用override重寫virtual方法。如果不希望這個方法被繼續重寫,則把這個方法寫成sealed方法。

  virtual方法必須在基類中實現。

  代碼實現:

 

復制代碼 代碼如下:

  class Program {
        static void Main(string[] args) {
            new Wolf().Eat();
            new Sheep().Eat();
            new Goat().Eat();
        }
    }

    public class Wolf : Animal {
        //多態實現
        public override void Eat() {
            base.Eat();
            Console.WriteLine("狼吃肉!");
        }
    }

    public class Sheep : Animal {
        //多態實現
        public override void Eat() {
            base.Eat();
            Console.WriteLine("羊吃草!");
        }
    }

    public class Goat : Sheep {
        //多態實現被終結,此Eat方法不能被override,因為用sealed了
        public sealed override void Eat() {
            //base.Eat();
            Console.WriteLine("山羊吃草!");
        }
    }

    //基類實現虛方法
    public class Animal {
        public virtual void Eat() { }
    }
 

  2.2.通過抽象方法實現的多態(abstract,override)

抽象方法必須定義在抽象類里。抽象類不能被創建實例。

基類中的抽象方法只能被聲明,不需要實現,所以派生類中重寫抽象方法的時候沒有base方法。

代碼實現如下:

復制代碼 代碼如下:

class Program {
        static void Main(string[] args) {
            new Wolf().Eat();
            new Sheep().Eat();
            new Goat().Eat();
        }
    }

    public class Wolf : Animal {
        //多態實現
        public override void Eat() {
            Console.WriteLine("狼吃肉!");
        }
    }

    public class Sheep : Animal {
        //多態實現
        public override void Eat() {
            Console.WriteLine("羊吃草!");
        }
    }

    public class Goat : Sheep {
        //多態實現被終結,此Eat方法不能被override,因為用sealed了
        public sealed override void Eat() {
            Console.WriteLine("山羊吃草!");
        }
    }

    //基類只需聲明方法
    public abstract class Animal {
        public abstract void Eat();
    }

總結:

1.虛方法重寫的時候可以有base方法(base.Eat()),抽象方法重寫的時候沒有base方法,原因是:虛方法必須在基類中實現,抽象方法只在基類中聲明,不需要實現。

2.派生類中可以 不重寫虛方法的實現,但是派生類必須重寫抽象方法的實現,原因同1.

3.包含虛方法的非抽象類可以被創建實例(對象),但是包含抽象方法的抽象類不能被創建實例。

4.繼承接口的派生類必須實現接口的方法,因為接口也是只負責聲明方法,不負責實現。

5.接口的多態性不需要用override重寫方法。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 德令哈市| 皋兰县| 元阳县| 武陟县| 邵阳县| 吴堡县| 边坝县| 曲沃县| 永新县| 县级市| 寻乌县| 永胜县| 丘北县| 石河子市| 房山区| 南皮县| 双江| 和硕县| 博乐市| 特克斯县| 隆回县| 玉树县| 唐河县| 巩义市| 梧州市| 雷波县| 洪江市| 金平| 巩留县| 林周县| 雅江县| 崇仁县| 丰都县| 阿拉善盟| 民乐县| 马公市| 山东| 上高县| 宁武县| 三河市| 聊城市|