一、前言
這篇文章將會講述虛擬(virtual)與覆蓋(override)的簡易使用方式。
二、虛擬(virtual)
虛擬具有多態(tài)性(Polymorphism)與擴展性(Extensibility),能讓程式根據(jù)實際運用產(chǎn)生不同效果,並方便程式員擴展程式碼而不用訪問基類。
1. 多態(tài)性(Polymorphism)
當(dāng)基類中的方法被標記為 virtual 時,它可以在派生類別中被覆寫(override)。當(dāng)A腳本繼承B的內(nèi)容時,稱B為基類、A為派生類別。這使得相同的函式,根據(jù)實際對象的類型而執(zhí)行不同的實現(xiàn),這稱之為多態(tài)性。
2. 擴展性(Extensibility)
因為覆寫的存在,可以在不觸碰基類的情況下,擴增或修改基類的函式與變數(shù),這種在不修改現(xiàn)有程式碼的情況下增加功能,稱為擴展性。
3. 存取修飾詞
談到繼承與覆寫,就可以了解一個新的存取修飾詞"protected"了,該存取修飾詞所修飾的欄位,只有在派生類別才能存取。
三、覆蓋(override)
基本上覆蓋(override)跟虛擬(virtual)是一起使用的,用於派生類別中覆蓋基類的函式或變數(shù)。
1. 用法
在派生類別中,創(chuàng)建一個與基類一模一樣的函式,在其存取修飾詞後面添加"Override"修飾詞即可。使用 override 以後,就可改寫該函式或變數(shù),可以結(jié)合基類的程式,或是完全重寫。
2. 基類
在派生類別中,如果想執(zhí)行基類的程式,則可以在覆蓋的函式中打上"Base.Function();"來執(zhí)行基類的函式,該處的 Function(); 則是這個函式的名稱。
四、使用流程
在 Unity 中,有一個很常用的繼承,那就是 MonoBehaviour,任何腳本只能繼承一個類別,因此可能會被 Monobehaviour 給困住,只要把含 MonoBehaviour 的腳本當(dāng)作基類即可。
1. 在 Unity 中創(chuàng)建空腳本
在 Unity 中創(chuàng)建一個空的腳本,命名為"VirtualTest"並刪除不必要的 Start 與 Update 函式。
using UnityEngine;
public class VirtualTest : MonoBehaviour
{
}
2. 宣告虛擬類型
隨後,宣告虛擬類型。
using UnityEngine;
public class VirtualTest : MonoBehaviour
{
protected virtual void virtualMethod() { }
}
3. 創(chuàng)建新的腳本並繼承腳本
創(chuàng)建一個新的腳本"VirtualTest_Child",同樣刪除不必要的函式,這次把 Monobehaviour 換成"VirtualTest"。
using UnityEngine;
public class VirtualTest_Child : VirtualTest
{
}
4. 覆蓋虛擬類型
創(chuàng)建同樣命名的函式,連同存取關(guān)鍵字一起照抄,原本 virtual 的位置改為 override ,這樣就成功了。
using UnityEngine;
public class VirtualTest_Child : VirtualTest
{
protected override void virtualMethod()
{
//Do something
}
}
5. 執(zhí)行基類程式
如果希望執(zhí)行基類程式,則添加"base.virtualMethod();"即可,該行程式碼會執(zhí)行基類的程式內(nèi)容。
using UnityEngine;
public class VirtualTest_Child : VirtualTest
{
protected override void virtualMethod()
{
base.virtualMethod();
}
}
五、後記
最近天氣真的很冷,還要趕專題的進度,總覺得寫文章的時間越來越少了阿。