文章出處

1.虛方法提供一種默認實現,子類可以選擇是否重寫,如果不重寫,那么就使用父類已經實現的方法。(重寫可以改變方法的指針)

如果需要改變類型指針,那么需要做方法的重寫:

1.如果子類方法是重寫方法,那么系統會掃描父類方法中,有沒有相同簽名的可重寫方法,如果沒有就報錯。

2.如果父類方法是虛方法,那么子類可以選擇是否重寫,如果重寫,就會調用子類的重寫方法,實現多態;如果沒有重寫,就會使用父類已經實現的方法。

3.實現多態需要實現方法的重寫

3.實現重寫得實現類的繼承

多態的使用:申明父類變量,實例化子類對象。

多態:一種操作,多種響應。

 

實現多態的思路:

1.先創建好父類,在創建好子類;

2.在父類中創建需要被重寫的虛方法或者抽象方法

3.在子類中重寫父類的虛方法或者抽象方法

4.申明父類類型的變量,實例化子類對象---寫出通用代碼;

 

1.聲明父類變量,實例化子類對象  如:Person per=new Student()

2.以父類作為方法的返回值類型,返回具體的子類對象---(簡單工廠,封裝變化點);

3,父類作為參數,傳入具體的子類對象;

 

 

父類People

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

namespace 多態的實現
{
    class People
    {
        #region ID
        int id;

        public int ID
        {
            get { return id; }
            set { id = value; }
        }
        #endregion

        #region Name
        string name;

        public string Name
        {
            get { return name; }
            set { name = value; }
        }
        #endregion

        #region Age
        int age;

        public int Age
        {
            get
            {
                //如果年齡大于0小于等于100,就返回,否則返回18歲
                if (age > 0 && age <= 100)
                {
                    return age;
                }
                else
                {
                    return 18;
                }
            }
            set
            {
                if (value > 0 && value <= 100) //注意這里不是: if(age>0&&age<=100)
                {
                    age = value;
                }
                else
                {
                    age = 18;
                }
            }
        }
        #endregion

        #region Sex
        string sex;

        public string Sex
        {
            get
            {
                //如果性別是男,或者女,就返回相應值,否則就設置為人妖
                if (sex == "" || sex == "")
                {
                    return sex;
                }
                else
                {
                    return "人妖";
                }
            }
            set
            {
                if (value == "" || value == "")
                {
                    sex = value;
                }
                else
                {
                    sex = "人妖";
                }
            }
        }
        #endregion

        public virtual void Show()
        {
            Console.WriteLine("我是父類People的Show方法");
        }

    }
}

 

子類Student

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

namespace 多態的實現
{
    /// <summary>
    /// 
    /// </summary>
    class Student : People   //實現多態必須要實現方法的重寫,實現重寫,必須要實現繼承
    {
        public override void Show()
        {

             Console.WriteLine("我是Student類的Show方法");
        }
        //public override void Show()
        //{
        //    //方法重寫默認是,調用父類的同名方法
        //    base.Show();
        //}
    }
}

 

子類Teacher

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

namespace 多態的實現
{
    class Teacher:People  //實現多態必須要實現方法的重寫,實現重寫,必須要實現繼承
    {
        override public void Show()
        {
            Console.WriteLine("我是teacher類的Show方法");
        }
    }
}

 

 測試:

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

namespace 多態的實現
{
    class Program
    {
        static void Main(string[] args)
        {
            //創建父類變量
            People[] p = new People[2];

            //實例化子類對象
            p[0] = new Student();
            p[1] = new Teacher();
            
            //寫出通用代碼
            p[0].Show();
            p[1].Show();
            Console.ReadKey();
        }
    }
}

 

 

例子2:

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

namespace 多態的練習
{
    class Animal
    {
        public virtual void GetFood()
        { 
           //虛方法往往不知道,怎么實現。
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 多態的練習
{
    class LaoYing:Animal
    {
        public override void GetFood()
        {
            Console.WriteLine("老鷹靠俯沖捕食。");
            //base.GetFood();
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 多態的練習
{
    class Snack:Animal
    {
        public override void GetFood()
        {
            Console.WriteLine("蛇靠偷襲捕食");
            //base.GetFood();  //虛方法提供了默認實現,就是調用父類的方法
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 多態的練習
{
    class Program
    {
        static void Main(string[] args)
        {
            //實現多態的步驟
            //1.先寫好父類,和可以被重寫的方法
            //2.寫好子類,重寫父類的方法
            //3.聲明父類變量,實例化子類對象

            Animal[] ans = new Animal[2];
            ans[0] = new Snack();
            ans[1] = new LaoYing();

            foreach (var item in ans)
            {
                item.GetFood();
            }
            Console.ReadKey();
        }
    }
}

結果是:

 


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()