簡體   English   中英

如果我需要訪問子類中的函數並且我有它的父引用,我該怎么辦?

[英]What can I do if I need to reach a function in child class and I have its parent reference?

抱歉標題,我無法想象更具體的標題,但讓我解釋一下。

假設我們有 2 個不同的角色。 一個是盟友,這是我們的角色,另一個是敵人。 假設我們是不朽的,所以 Ally 不會死。

public class Ally : BaseCharacter
    {
        public override void Attack() { }
    }

    public class Enemy : BaseCharacter
    {
        public void Die() { }
        public override void Attack() { }
    }

    public class BaseCharacter
    {
        public BaseCharacterData baseCharacterData;

        public virtual void Attack() { }
    } 

在這里,Attack() 函數在這些子類之間是通用的。 但 Die() 函數不是。

我們有這些類的數據類。

    public class AllyData : BaseCharacterData
    {
    }

    public class EnemyData : BaseCharacterData
    {
        public string health;
    }

    public class BaseCharacterData
    {
        public string name;
    }

而且在這里,NAME 變量是常見的,而 HEALTH 不是(因為 Ally 不能死)。

問題是這樣的,當我嘗試從另一個腳本創建 BaseCharacter 時,我將 CharacterData 分配給 Ally,這很好。

但是當我創建 Enemy 時,Enemy 的生命值不會被設置(我可以從其他地方以某種方式設置它,但是當我需要到達它時它也是一個問題)。 另外,假設我們有另一個名為 TEMP 的類,它的一個函數采用 CharacterData。 但是,如果 CharacterData 屬於 Enemy,它將無法達到 HEALTH,或者它將無法從 Enemy 的 BaseCharacter 腳本調用 Die() 函數,因為它不常見。

這整個場景不是真實的,沒有意義,但我嘗試簡化它並告訴我我的問題是什么樣的。

我的問題是,我做錯了什么還是這種情況只需要一個更好的結構來實現我的目標?

我對所有建議或解決方案持開放態度,但我並不想輕易解決我的問題或以不好的方式解決它。 只是試圖找到正確的方法。

謝謝大家。

死亡不是召喚角色的東西。 它是響應角色發生的事情而發生的事情。 角色可能發生的事情:

  • 喝了毒葯P,
  • 被一塊重量為 W 的石頭擊中到身體 B 部分,
  • 被重量為 W、速度 V、附魔 E 的箭擊中,射向身體部位 B
  • 掉到一個物體上 O(有毒的尖刺或普通的舊地面)
  • 被名為“just die already”的魔法擊中

所以這些是你的方法。 敵人可能會死於它們,而盟友則不會,但即使是盟友也會經歷一些其他影響(頭暈、昏迷等)。

您已將類似於 baseCharacter 類的數據類定義為兩種類型。 為什么不在類本身中設置信息? 消除替代重復第一節也是最重要的編程課。

public class Ally : BaseCharacter
{
    public override void Attack() { }
}

public class Enemy : BaseCharacter
{
    public float health;
    public void Die() { }
    public override void Attack() { }
}

public class BaseCharacter
{
    public string name;
    public virtual void Attack() { }
} 

訪問類

public void Start()
{
    BaseCharacter character = new Enemy();

    if (character is Enemy myEnemy)
    {
        myEnemy.health = 52; // for e.g
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM