今天練習虛方法與多態,順便想在子類中使用父類的構造函數,沒有寫過類似的用法,也出了Bug,就上網找了資料寫了這篇來當筆記。
首先,我們需要在父類(此範例為father)中自定義一個構造函數,寫法如下:
public father(string father_name) { //此處的Name是我在父類中宣告的一個屬性 Name = father_name; }
然後,在子類(此範例為child)中自定義一個構造函數,並使用base來繼承father中定義的構造函數:
//自定義構造函數 public child(string child_name) : base(child_name) { //此處可以不用寫任何東西,因為base直接調用父類father的構造函數,將子類child構造函數內的child_name,回調給父類Bird構造函數內的father_name }
實際範例:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Bird { private string name; public string Name { set { name = value; } get { return name; } } public Bird(string Bird_name) { Name = Bird_name; } public virtual void Eat() { Debug.Log("這是鳥類 [" + this.Name + "] ,喜歡吃蟲"); } } public class Magpie : Bird, IOriginalEat { //自定義構造函數 public Magpie(string Magpie_name) : base(Magpie_name) { //此處可以不用寫任何東西,因為base直接調用父類Bird的構造函數,將子類Magpie構造函數內的Magpie_name,回調給父類Bird構造函數內的Bird_name } public override void Eat() { Debug.Log("這是喜鵲 [" + this.Name + "] ,喜歡吃蟲"); } //實現OriginalEat介面並實作OriginEat方法 public void OriginEat() { //使用父類Bird中的Eat方法 base.Eat(); } } public class Eagle : Bird { //自定義構造函數 public Eagle(string Eagle_name) : base(Eagle_name) { //此處可以不用寫任何東西,因為base直接調用父類Bird的構造函數,將子類Eagle構造函數內的Eagle_name,回調給父類Bird構造函數內的Bird_name } public override void Eat() { Debug.Log("這是老鷹 [" + this.Name + "] ,喜歡吃肉"); } } public class Penguin : Bird { //自定義構造函數 public Penguin(string Penguin_name) : base(Penguin_name) { //此處可以不用寫任何東西,因為base直接調用父類Bird的構造函數,將子類Penguin構造函數內的Penguin_name,回調給父類Bird構造函數內的Bird_name } public override void Eat() { Debug.Log("這是企鵝 [" + this.Name + "] ,喜歡吃魚"); } } public interface IOriginalEat { void OriginEat(); }
實際引用:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Polymorphism : MonoBehaviour { Bird[] birds = { new Magpie("Mapie001"), new Eagle("Eagle001"), new Penguin("Penguin001"), new Bird("Bird001") }; // Use this for initialization void Start() { Debug.Log(birds[0].Name); Debug.Log(birds[1].Name); Debug.Log(birds[2].Name); Debug.Log(birds[3].Name); foreach (Bird item in birds) { item.Eat(); } IOriginalEat Mapie002 = new Magpie("Mapie002"); Mapie002.OriginEat(); Magpie Mapie003 = new Magpie("Mapie003"); Mapie003.OriginEat(); } // Update is called once per frame void Update() { } }
輸出結果: