1. 程式人生 > >C#(四)-【多型】

C#(四)-【多型】

概述

多型的字面意思是“多種狀態”,多型是面向物件三大特性之一,它是指同一個實體同時具有多種形式。如果一個語言只支援類而不支援多型,只能說明它是基於物件的,而不是面向物件的。

功能

1.多型——隱藏基類方法與多型的實現。
——子類可以有與父類方法名相同的方法。
——子類可以重寫父類方法
多型就是物件可以表現多個型別的能力。

2.子類的方法名可以和父類的方法名重名,但是會出現一條綠線,瑕疵,怎麼解決?
第一種方法:可以在子類方法的修飾符後面加new就解決了。無論是否加new都不影響使用。
第二種方法:可以在父類的方法修飾符後面加virtual,在子類重寫父類的方法,加上一個override,呼叫父類的方法,但是把父類的方法進行了重寫,更換了方法裡面的內容。

3.虛方法與重寫
(1).方法不能用static修飾。
(2).方法重寫與基類的簽名必須一致。
(3).virtual不能與private一起使用。

4.抽象類與抽象方法由abstract修飾。

5.abstract的使用注意。
(1).抽象方法沒有方法體
(2).抽象成員只能存在於抽象類中
(3).抽象類可以有非抽象成員
(4).抽象類的派生類必須實現抽象方法體
(5).抽象類只能用作基類,無法例項化。

6.override與過載(overload)的區別?
過載是方法的名稱相同。引數或引數型別不同,進行過載以適應不同的需要。過載(overload)是面向過程的概念。Override是進行基類中函式的重寫。Override是面向物件的概念。
重寫和過載不一樣要區分開。

實戰練習

定義一個動物類,在動物類(animal)中有一個叫的抽象方法。寫兩個子類,一個貓一個狗,繼承自動物類,並實現相應的抽象方法。

//隨機的產生10個類的物件
            //放在數組裡
            //之後遍歷這個陣列,把方法調出來。

  static void Main(string[] args)
        {
            //隨機的產生10個類的物件
            //放在數組裡
            //之後遍歷這個陣列,把方法調出來。
            Animal[] animal = new Animal[10];
            Random r = new Random();

            for (int i =0;i<animal.Length;i++)
            {
                int num = r.Next(1, 5);
                switch (num)
                {
                    case 1: animal[i] = new Pig("小趙"); break;
                    case 2: animal[i] = new Cow("小趙"); break;
                    case 3: animal[i] = new Cat("小趙"); break;
                    case 4: animal[i] = new Dog("小趙"); break;
                }

            }
            for (int i=0;i<animal.Length;i++)
            {
                animal[i].Shout(); 
            }
            Console.ReadKey();
        }
    }
    public abstract class Animal
    {
        public Animal(string name)
        {
            this._name = name;
        }
        string _name;

        public  string Name
        {
            get { return _name; }
            set { _name = value; }
        }
        public abstract void Shout();
    }

    public class Pig : Animal
    {
        public Pig(string name)
            :base(name)
        {

        }
        public override void Shout()
        {
            Console.WriteLine("{0}哼哼哼.....",this.Name);
        }
    }

    public class Dog : Animal
    {
        public Dog(string name)
           : base(name)
        {

        }
        public override void Shout()
        {
            Console.WriteLine("{0}旺旺旺...",this.Name);
        }
    }

    public class Cow:Animal
    {
        public Cow(string name)
           : base(name)
        {

        }
        public override void Shout()
        {
            Console.WriteLine("{0}哞哞哞....",this.Name);
        }
    }

    public class Cat:Animal
    {
        public Cat(string name)
           : base(name)
        {

        }
        public override void Shout()
        {
            Console.WriteLine("{0}喵喵喵...",this.Name);
        }
    }

實現

1.虛方法:
用virtual修飾的方法叫做虛方法
虛方法可以在子類中通過override關鍵字來重寫
常見的虛方法:ToString()Equals

2.虛方法與抽象方法的區別?
(1).虛方法必須有實現部分,抽象方法沒有提供實現部分,抽象方法是一種強制派生類覆蓋的方法,否則派生類將不能被例項化。
(2).抽象方法只能在抽象類中宣告,虛方法不是。其實如果類包含抽象方法,那麼該類也是抽象的,也必須宣告為抽象的。
(3).抽象方法必須在派生類中重寫,這一點跟介面類似,虛方法不必。

3.介面:
(1).介面的定義:interface關鍵字,介面中可以有屬性、方法(未實現)。
(2).介面的名稱通常以“I”開頭,如IList。
(3).如果一個類即繼承了類又實現了介面,那麼類必須寫在前面。一個類只能繼承一個父類,但可以實現多個介面。
(4).完全抽象的一種約定。
(5).介面就是用來實現的。
(6).介面只有方法、屬性、索引和事件的宣告。

4.C#中的介面和類有什麼異同?
(1).不同點:
不能直接例項化介面。
介面不包含方法的實現
介面可以多實現,類只能單實現。
類定義可在不同的原始檔之間進行拆分
(2).相同點:
介面、類和結構都可以從多個介面繼承
介面類似於抽象基類:繼承介面的任何非抽象型別都必須實現介面的所有成員。
介面和類都可以包含事件、索引器、方法和屬性

5.C#支援多繼承麼?
類之間不支援,介面之間支援。類對介面叫做實現,不叫繼承。類是爹、介面是能力,能有多個能力,但不能有多個爹。

6.抽象類和介面有什麼區別?
(1).相同點:
都不能被直接例項化,都可以通過繼承實現其抽象方法。
(2).不同點:
介面支援多繼承;抽象類不能實現多繼承。
介面只能定義行為;抽象類既可以定義行為,還可能提供實現。

總結

多型意味著一個物件有著多重特徵,可以在特定的情況下,表現不同的狀態,從而對應著不同的屬性和方法。我的理解就是比如說一個三輪它可以在旁邊加掃把然後邊蹬三輪邊讓三輪車掃地,也可以在三輪的旁邊加拖把,讓三輪車有不同的特徵。