close

什麼是多型?

1.多型就是同類型的物件,不同型別的實體,執行相同的功能得到的結果不同。

2.做多型時「繼承」加上「覆寫」也會同時做到。

 

舉個例子:

復仇者聯盟裡面不只一個英雄,有鋼鐵人、浩克、美國隊長,他們都有名字和各自的攻擊方式,裡面成員會持續增加,不過他們都有相同的的地方,例如名字、如何攻擊,所以我們可以把相同的東西抽出來放在復仇者花盟裡面,每個人再繼承復仇者聯盟然後複寫

多型圖片  

可以看到鋼鐵人、浩克、美國隊長都繼承復仇者聯盟,他們都有各自的名字和攻擊方式

多型類別圖       

多型的存取修飾詞有以下幾種:

1.abstract 抽象方法,是空的沒有實體的方法,派(衍)生類必須以 override 實現此方法。

2.virtual 虛擬方法,如果希望或預料到基礎類別的這個方法在將來的派(衍)生類別中會被覆寫(override 或 new),如果衍生類別沒有override掉,就會直接詰用父類別。

3.Base 參考父類別的屬性、方法、資料欄位。

4.override 覆寫繼承自父類別的方法,可以理解為拆掉老房子,在原址上建新房子,老房子再也找不到了(父類別方法永遠調用不到了)。

5.New 隱藏基礎類別方法。

呼叫多型的方法:

public void HeroAttack(Marvel hero)
{
   Label1.Text = string.Format("由{0}發動{1}攻擊", hero.HeroName, hero.Attack());
}

使用Virtual的話再父類別可以先實作然後繼承的子類別可以選擇沿用或著直接複寫:

    //父類別-Marvel
    public class Marvel
    {
        public virtual string Attack()
        {
            return "徒手";
        }

        public virtual string HeroName
        {
            get
            {
                return string.Empty;
            }
        }
    }

    //子類別-鋼鐵人
    public class IronMan : Marvel
    {
        public override string Attack()
        {
            return "飛彈";
        }

        public override string HeroName
        {
            get
            {
                return "鋼鐵人";
            }
        }
    }

    //子類別-浩克
    public class Hulk : Marvel
    {
        //用Base調用父類別的方法
        public override string Attack()
        {
            return base.Attack() + "炸裂";
        }

        public override string HeroName
        {
            get
            {
                return "浩克";
            }
        }
    }

    //子類別-美國隊長
    public class CaptainAmerica : Marvel
    {
        public override string Attack()
        {
            return "丟飛彈";
        }

        public override string HeroName
        {
            get
            {
                return "美國隊長";
            }
        }
    }

使用Abstract的話再父類別只可以先定義然後繼承的子類別再實作:

    //父類別-MarvelAbstract
    public abstract class MarvelAbstract
    {
        public abstract string Attack();

        public abstract string HeroName();

        public string Jump()
        {
            return string.Empty;
        }
    }

    //子類別-鋼鐵人
    public class IronManAbstract : MarvelAbstract
    {
        public override string Attack()
        {
            return "飛彈";
        }

        public override string HeroName
        {
            get
            {
                return "鋼鐵人";
            }
        }
    }

使用的方法也很簡單

IronMan ironMan = new IronMan();
HeroAttack(ironMan);
arrow
arrow

    Leo 發表在 痞客邦 留言(0) 人氣()