文章出處
文章列表
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(); } } }
結果是:
文章列表
全站熱搜