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

C#中面向?qū)ο缶幊虣C(jī)制之多態(tài)學(xué)習(xí)筆記

 更新時(shí)間:2015年01月20日 09:54:22   投稿:junjie  
這篇文章主要介紹了C#中面向?qū)ο缶幊虣C(jī)制之多態(tài)學(xué)習(xí)筆記,本文總結(jié)了個(gè)人對(duì)多態(tài)的理解以及接口多態(tài)、繼承多態(tài)等內(nèi)容,并給出了代碼示例,需要的朋友可以參考下

C#的多態(tài)性:

我的理解是:同一個(gè)操作,作用于不同的對(duì)象時(shí),會(huì)有不同的結(jié)果,即同一個(gè)方法根據(jù)需要,作用于不同的對(duì)象時(shí),會(huì)有不同的實(shí)現(xiàn)。

C#的多態(tài)包括:接口多態(tài),繼承多態(tài)。

其中繼承多態(tài)又包括通過(guò)虛擬方法實(shí)現(xiàn)的多態(tài)和通過(guò)抽象方法實(shí)現(xiàn)的多態(tài)性

例如:基類動(dòng)物都有吃的方法,但是不同的動(dòng)物吃的東西就會(huì)不一樣,例如狼吃肉,羊吃草,這樣“吃”的這個(gè)方法就要在派生類里面重新實(shí)現(xiàn)以下,運(yùn)行時(shí),通過(guò)指向基類的指針,來(lái)調(diào)用實(shí)現(xiàn)派生類中的方法。

接下來(lái)舉例實(shí)現(xiàn)多態(tài)性。

1. 接口多態(tài)性

把動(dòng)物“吃”的方法放到一個(gè)接口(IAnimal)里,然后讓具體的動(dòng)物類(Wolf/Sheep)繼承這個(gè)接口,并根據(jù)自己的需要實(shí)現(xiàn)這個(gè)接口。

代碼實(shí)現(xiàn):

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

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

    public class Wolf : IAnimal {
        //多態(tài)實(shí)現(xiàn)
        public void Eat() {
            Console.WriteLine("狼吃肉!");
        }
    }

    public class Sheep : IAnimal {
        //多態(tài)實(shí)現(xiàn)
        public void Eat() {
            Console.WriteLine("羊吃草!");
        }
    }

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

接口的多態(tài)性就是當(dāng)不同的類繼承了相同的接口以后,都要根據(jù)自己的需要重新實(shí)現(xiàn)繼承的接口,這樣同樣的方法簽名在不同的類中就會(huì)實(shí)現(xiàn)不同的操作。

2. 繼承的多態(tài)性

2.1.通過(guò)虛擬方法實(shí)現(xiàn)的多態(tài)(virtual,override)

   首先要在基類中實(shí)現(xiàn)virtual方法,然后在派生類中根據(jù)自己的需要用override重寫virtual方法。如果不希望這個(gè)方法被繼續(xù)重寫,則把這個(gè)方法寫成sealed方法。

  virtual方法必須在基類中實(shí)現(xiàn)。

  代碼實(shí)現(xiàn):

 

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

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

    public class Wolf : Animal {
        //多態(tài)實(shí)現(xiàn)
        public override void Eat() {
            base.Eat();
            Console.WriteLine("狼吃肉!");
        }
    }

    public class Sheep : Animal {
        //多態(tài)實(shí)現(xiàn)
        public override void Eat() {
            base.Eat();
            Console.WriteLine("羊吃草!");
        }
    }

    public class Goat : Sheep {
        //多態(tài)實(shí)現(xiàn)被終結(jié),此Eat方法不能被override,因?yàn)橛胹ealed了
        public sealed override void Eat() {
            //base.Eat();
            Console.WriteLine("山羊吃草!");
        }
    }

    //基類實(shí)現(xiàn)虛方法
    public class Animal {
        public virtual void Eat() { }
    }
 

  2.2.通過(guò)抽象方法實(shí)現(xiàn)的多態(tài)(abstract,override)

抽象方法必須定義在抽象類里。抽象類不能被創(chuàng)建實(shí)例。

基類中的抽象方法只能被聲明,不需要實(shí)現(xiàn),所以派生類中重寫抽象方法的時(shí)候沒(méi)有base方法。

代碼實(shí)現(xiàn)如下:

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

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

    public class Wolf : Animal {
        //多態(tài)實(shí)現(xiàn)
        public override void Eat() {
            Console.WriteLine("狼吃肉!");
        }
    }

    public class Sheep : Animal {
        //多態(tài)實(shí)現(xiàn)
        public override void Eat() {
            Console.WriteLine("羊吃草!");
        }
    }

    public class Goat : Sheep {
        //多態(tài)實(shí)現(xiàn)被終結(jié),此Eat方法不能被override,因?yàn)橛胹ealed了
        public sealed override void Eat() {
            Console.WriteLine("山羊吃草!");
        }
    }

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

總結(jié):

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

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

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

4.繼承接口的派生類必須實(shí)現(xiàn)接口的方法,因?yàn)榻涌谝彩侵回?fù)責(zé)聲明方法,不負(fù)責(zé)實(shí)現(xiàn)。

5.接口的多態(tài)性不需要用override重寫方法。

相關(guān)文章

最新評(píng)論