如何从每个基类的继承类调用属性?

时间:2014-05-01 17:15:51

标签: c# polymorphism

我真的不知道它是否可能,但如果它可能会很好。所以,对于我的角色扮演游戏,我试图实施一些其他可能的任务计划(直到知道只有怪物狩猎任务的可能性,现在我想实现某种“与这个人交谈” -Quests或“查找那个和那个项目”-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;
    }
}

MonsterQuest

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只是一个List,我添加了一个MonsterQuest元素。这个片段是我的Enemy-Class的一部分,只是为了注意^^)

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

我希望有人理解我的问题,可以帮我解决:) 祝你有愉快的夜晚

1 个答案:

答案 0 :(得分:0)

总结这一点的最好方法可能是基类对可能会或可能不会继承它的类一无所知。它能做的最好的事情是定义任何继承类必须实现的特定签名。

一般来说,有几种方法可以解决这个问题。一种方法是使基类抽象,定义其功能,以及每个派生类必须满足的一组抽象签名。在这种情况下,您总是会调用children类 - 但仍然可以在基类中重用公共代码。

另一种方法是创建一个接口,比如说IKillable,然后让所有类都实现它们。然后,您可以针对IKillable对象进行调用。

寻找一些关于抽象类和接口的好教程将为您提供我所怀疑的所需内容。

希望能让你开始。