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