1. 程式人生 > >用一個例子說明什麼是多型

用一個例子說明什麼是多型

OOP面向物件的三個特性:封裝、繼承和多型。前面兩個特性好理解,多型則常常搞得很多人頭暈,網上的解釋也是五花八門。

什麼是多型?按百度百科的解釋,多型(Polymorphism)按字面的意思就是“多種狀態”。在面嚮物件語言中,介面的多種不同的實現方式即為多型。引用Charlie Calverts對多型的描述——多型性是允許你將父物件設定成為和一個或更多的他的子物件相等的技術,賦值之後,父物件就可以根據當前賦值給它的子物件的特性以不同的方式運作(摘自“Delphi4 程式設計技術內幕”)。簡單的說,就是一句話:允許將子類型別的指標賦值給父類型別的指標。多型性在Object Pascal和C++中都是通過虛擬函式(Virtual Function) 實現的

我認為這種說法比較容易理解:多型是為了實現介面重用,說白了,就是父類引用指向子類的物件(即將子類賦值給父類),進行動態繫結,不同的子類有不同的實現。下面用常用比喻作一個例子(動物,叫聲,不同動物發出的是不同的叫聲)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Polymor
{
    class Program
    {
        static void Main(string[] args)
        {
            Animal Animal = new Animal();
            Animal dog = new dog(); //允許將子類型別的指標賦值給父類型別的指標。
            Animal cat = new cat();
            Animal cattle = new cattle();

            Animal.sounds();
            dog.sounds(); //介面重用
            cat.sounds();
            cattle.sounds();
            Console.ReadKey();
        }

    }

    class Animal
    {
        public virtual void sounds() //通過虛擬函式實現
        {
            Console.WriteLine("動物的叫聲");
        }
    }

    class dog : Animal
    {
        public override void sounds() //重寫、覆蓋
        {
            Console.WriteLine("狗的叫聲:旺旺...");
        }
    }

    class cat : Animal
    {
        public override void sounds()
        {
            Console.WriteLine("貓的叫聲:喵喵...");
        }
    }

    class cattle : Animal
    {
        public override void sounds()
        {
            Console.WriteLine("牛的叫聲:哞哞...");
        }
    }
}

輸出結果為

動物的叫聲:

狗的叫聲:旺旺...

貓的叫聲:喵喵...

牛的叫聲:哞哞...

我個人認為多型主要是三個特點:

1、重寫(override)

2、通過虛擬函式實現

3、父類引用指向子類的物件

好吧,按我的理解,再簡單點,奶奶的,不就是子類重寫父類虛擬函式嗎?!

一家之言,不當之處還望指教。