簡體   English   中英

如何從每個基類的繼承類調用屬性?

[英]How to call property from inherited class per base class?

我真的不知道是否有可能,但是如果可以的話會很好。 因此,對於我的角色扮演游戲,我嘗試實施其他一些可能的Quest方案(直到知道只有一個怪物狩獵任務的可能性,現在我想實施某種“與該人交談” -Quests或“ Find that and that Item” -Quest)。 因此,我創建了一個新的Quest-Class,將舊的Quest-Class重命名為MonsterQuest,並從Quest繼承了它。 因此,現在,我有了一個List,並希望遍歷所有元素,直到找到一個KilledMonsters高於3的元素為止。 問題是,KilledMonster不在基類中實現,而僅在MonsterQuest-Class中實現:(

以下是這些類目前的狀態:

尋求

public class Quest
{
    public int Accept_MinLevel { get; protected set; }
    public string NPC_Name { get; protected set; }
    public bool Accepted { get; protected set; }
    public bool Completed { get; set; }
    public bool HasStillRewards = true;

    public double Reward_Experience { get; protected set; }
    public int Reward_Money { get; protected set; }

    public Quest(int accept_MinLevel, string npc_Name, double reward_experience, int reward_Money)
    {
        Accept_MinLevel = accept_MinLevel;
        NPC_Name = npc_Name;
        Reward_Money = reward_Money;
        Reward_Experience = reward_experience;
    }

    public virtual void Update(GameTime gameTime)
    {
    }

    public bool WaitForReward()
    {
        return Completed && HasStillRewards;
    }
}

怪物探索

public class MonsterQuest : Quest
{
    public List<Enemy> KilledEnemyList = new List<Enemy>();

    public int RequiredMonster_Amount { get; private set; }
    public string RequiredMonster_Name { get; private set; }
    public int RequiredMonster_MinLevel { get; private set; }

    public MonsterQuest(string npcName, int accept_MinLevel, string requiredMonster_Name, int requiredMonster_MinLevel, int requiredMonster_Amount, double reward_Experience, int reward_Money) : base(accept_MinLevel, npcName, reward_Experience, reward_Money)
    {
        NPC_Name = npcName;
        Accept_MinLevel = accept_MinLevel;
        RequiredMonster_Amount = requiredMonster_Amount;
        RequiredMonster_MinLevel = requiredMonster_MinLevel;
        RequiredMonster_Name = requiredMonster_Name;
        Reward_Experience = reward_Experience;
        Reward_Money = reward_Money;
    }

    public override void Update(GameTime gameTime)
    {
        if (KilledEnemyList.Capacity >= RequiredMonster_Amount)
            Completed = true;
    }
}

而且,我怎么說,我想這樣做(來自另一個類。QuestList只是一個列表,我在其中添加了MonsterQuest元素。此代碼段是我的敵人級的一部分,只是為了注意^^)

foreach (var item in Storyline.QuestList.Where(c => c.Accepted && !c.Completed && c.RequiredMonster_Name == Name && c.RequiredMonster_MinLevel <= Level))
            {
                item.KilledEnemyList.Add(this);
            }

我希望任何人都能理解我的問題並能幫助我解決問題:)祝您晚上愉快

概括起來最好的方法是,基類對可能繼承或不繼承它的類一無所知。 最好的辦法是定義任何繼承類都必須實現的某些簽名。

通常,有幾種方法可以解決此問題。 一種方法是使基類抽象,定義其功能以及每個派生類必須滿足的一組抽象簽名。 在這種情況下,您將始終對子類進行調用-但在基類中仍可能會重復使用通用代碼。

另一種方法是創建一個接口,例如IKillable,然后讓所有類都實現它們。 然后,您可以對IKillable對象進行調用。

尋找一些關於抽象類和接口的優秀教程,可以滿足您的需求。

希望能幫助您入門。

暫無
暫無

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

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