你在找什麼是接口,或抽象/虛擬功能。廣義地說,有兩種技術:
public abstract class Character : MonoBehaviour
{
public float m_Health { get; protected set; }
protected abstract float DefaultHealth { get; }
void Awake()
{
m_Health = DefaultHealth;
}
}
public class Enemy : Character
{
protected override float DefaultHealth { get { return 10; } }
}
(使用虛擬函數而不是抽象如果應該有一個基實現和壓倒一切的是可選的。)使用上述圖案時,所述邏輯被所有共享,但很少位在子類中有不同的規定。基類中的大功能調用可能在子類中指定的小函數。
第二種技術是用於對上述類看起來一樣到外面的世界,但在根本上有不同的功能:
public interface ILiving
{
float Health { get; }
}
public class Character : ILiving
{
// implement health as a normal variable
public float Health { get; protected set; }
}
public class OldMan : ILiving
{
// implement health based on time until death at 2020
public float Health { get { return (2020-DateTime.Now.Year)/20; } }
}
在這種情況下,兩種類型都具有健康,但邏輯通過其操作是不同的。對外界來說,它們看起來是一樣的,但它們如此不同以至於它們不應該共享任何邏輯。
請注意,在Unity中,事情可能會變得混亂。由於我們被迫繼承了MonoBehaviour
(而C#沒有多重繼承),所以我們偶爾不會在我們想要的地方使用繼承。在這些情況下,我們可以通過使用接口,顯式接口實現(合理的傳真保護功能)和擴展方法來模仿繼承。 (定義擴展方法的類將扮演基類的角色。)通常,當類想要成爲兩個類層次結構的一部分(基於兩個不可調和的功能集)時,就會出現這種情況。在遊戲中,裝甲,武器和法術可能都希望參與升級系統。裝甲和武器是裝備等級體系的一部分,但法術不是。所以相關數據被製作成接口函數,並且共享代碼被定義爲擴展方法(因爲除了MonoBehaviour
之外,裝甲和法術不共享公共基類)。
感謝這個細節! –