1. 程式人生 > >菜鳥的C#學習之旅——多型的實現途徑

菜鳥的C#學習之旅——多型的實現途徑

目錄

一、定義

二、虛方法:

三、抽象類與抽象方法:

四、介面實現:

五、總結:


一、定義


多型:在面嚮物件語言中,介面的多種不同實現方式即為多型

多型性就是指在程式執行時,執行的雖然是一個呼叫方法的語句,卻可以根據派生類物件的型別的不同完成方法不同的具體實現。在C#中可以通過多種途徑實現多型性。

二、虛方法:


將父類的方法標記為虛方法,使用關鍵字virtual,此方法在子類中可以重寫(使用關鍵字override)

1.當某個例項方法宣告包括 override 修飾符時,該方法將重寫所繼承的具有相同簽名的虛方法。

2.子類可以重寫父類,可以不重寫。
(1)重寫:當子類重寫的時候,顯示的就是重寫後的內容;

(2)隱藏:當子類不進行重寫的時候,顯示的就是原來父類中的內容。

3.重寫只能重寫父類的虛方法,實方法是不可以重寫的。

4.虛方法不能用 static 修飾 。

5.虛方法不能用 private 修飾,因為虛方法就是讓子類來重寫的,如果宣告為 private,子類就無法重寫,所以不能是私有的 。

6.例項(程式碼展示)

static void Main(string[] args)
        {
          

            //可以在父類的方法的修飾符後面加 virtual

            //在子類中重寫父類的方法,加上一個override;呼叫父類的方法,但是把父類的方法進行重寫了
            //更換了方法裡面的內容


            Person p = new Person();
            p.Show();

            Teacher t = new Teacher();
            t.Name = "張三";
            t.Age = 90;
            t.Gender = '男';
            t.Show();

            Console.ReadKey();

        }
    }
    public class Person
    {
        private string _name;
        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }

        private char _gender;
        public char Gender
        {
            get { return _gender; }
            set {_gender = value ;}
        }

        private int _age;
        public int Age
        {
            get { return _age; }
            set { _age = value; }
        }
        public virtual void Show()//虛方法----
         {
             Console.WriteLine("我是人別害怕");
         }

        public void Say()
        {
            Console.WriteLine("Hello");
        }

    }
    public class Teacher : Person
    {
        public override  void Show()
        {
            Console.WriteLine("我是老師");
        }

三、抽象類與抽象方法:


如果我們不需要使用父類建立物件,它的存在只是為供子類繼承。可以將父類寫成抽象(關鍵字abstract)類,將父類的方法

寫成抽象方法,子類中的方法仍用關鍵字override重寫。

1.抽象方法使用 abstract 修飾符進行宣告,並且只有在同樣被宣告為 abstract 的類中才允許出現。

2.抽象方法必須在每個非抽象派生類中重寫。

3.抽象方法沒有方法體。

4.抽象類無法例項化。

5.抽象類中的抽象方法是給子類寫的,父類自己用不了。

6.父類是抽象類,子類繼承了這個類,必須把抽象類中的抽象方法重寫。

7.例項:(程式碼展示)

 static void Main(string[] args)
        {
            //抽象方法是用abstract修飾;
            //抽象方法沒有方法體
            //抽象方法必須在抽象類中
            //抽象類無法例項化
            //抽象類中的抽象方法是給子類寫的,它自己用不了
            //父類是抽象類,子類繼承了這個類,必須把抽象類中的抽象方法重寫

            Chinses china = new Chinses ();
            china .Speak ();
            Console .ReadKey ();
        }
    }
    public abstract  class Person
    {
        private string _name;
        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }

        private char _gender;
        public char Gender
        {
            get { return _gender; }
            set { _gender = value; }
        }

        private int _age;
        public int Age
        {
            get { return _age; }
            set { _age = value; }
        }

        public abstract void Speak();
        
    }
    public class Chinses:Person
    {
        public override void Speak()
        {
            Console.WriteLine("漢語");//重寫了父類中的抽象方法
        }

四、介面實現:


介面使用 interface 關鍵字宣告,它與類的宣告類似。介面宣告預設是 public 的。通常介面命令以 I 字母開頭。

1.介面不能直接例項化。

2.介面可以多實現,但是類只能單繼承。

3.類定義可以在不同的原始檔之間進行拆分 介面則不可以。

4.介面類似於抽象基類:繼承介面的任何非抽象型別都必須實現介面的所有成員。

5.介面可以實現介面。

6.例項:(程式碼展示)

static void Main(string[] args)
        {
            //這裡的IFly既不是父類又不是主類,為什麼能New出student?
            //其實原因就在與Student實現了IFly這個介面
            //其實這個也是多型的一種體現形式(非常高階的內容)
            //介面不能直接例項化
            //介面可以多實現,但是類只能單繼承
            //類定義可以在不同的原始檔之間進行拆分 介面則不可以

            //介面、類、結構都可以從多個介面繼承
            //介面類似於抽象基類:繼承介面的任何非抽象型別都必須實現介面的所有成員
            //介面可以實現介面

            IFly ifly = new Student();
            ifly.IFly();
            Console.ReadKey();
        }
    }
    public class Person
    {
        private string _name;
        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }

        private char _gender;
        public char Gender
        {
            get { return _gender; }
            set {_gender = value ;}
        }

        private int _age;
        public int Age
        {
            get { return _age; }
            set { _age = value; }
        }

        public void Say()
        {
            Console.WriteLine("Hello");
        }
    }

    public class Teacher:Person,IFly //既有繼承又有介面的情況
    {
        public void Say()
        {
            Console.WriteLine("我是老師");
        }

        public void IFly()//實現介面,這裡的內容不可以省略,既然用就必須實現,不可以空缺
        {
            Console.WriteLine("我會飛");
        }

        void IFly.IFly()//顯示實現介面
        {
            Console.WriteLine("我也會飛");
        }
    }

    public class Student:IFly //介面叫實現不叫繼承
    {
        public void SayHello()
        {
            Console.WriteLine("我是學生");
        }
        public void IFly()
        {
            Console.WriteLine("我會飛");
        }

五、總結:


當然就我目前水平認識的多型還遠遠不夠,有很多的知識還隱藏在其後,需要我們不斷的總結和實踐方能見到其真相。本文中

如有不恰當之處,還望指出。本人不甚感激。