c# 继承 - 如何检查 child 的类型

c# inheritance - how to check type of child

我有一个名为 Card 的抽象 class,以及两个继承自这个名为 Minion 和 Spell 的 classes。我还有一张卡片列表,我可以在其中保存仆从或法术。最后,我有一种方法可以处理此列表中的每张卡片,它会根据卡片类型(随从或法术)返回值。所以它看起来像:

abstract class Card
{
    string name;
}

class Minion : Card
{
    public int attack;
}

class Spell : Card
{
    public int cost;
}

class Game
{
    List<Card> cards;

    private void ReadCards()
    {
        cards = new List<Card>();
        //READ CARDS FROM DATABASE AND ADD TO COLLECTION
        //cards.Add(new Minion()) or cards.Add(new Spell())
    }

    private int GetInfo(Card card)
    {
        //IF card IS A MINION return card.attack; OTHERWISE return card.cost;
    }
}

问题是我不确定 "GetInfo" 应该如何正常工作。我试过这样的事情:

private int GetInfo(Card card)
{
    if(card.GetType() == typeof(Minion))
    {
        return (Minion)card.attack;
    } else return (Spell)card.cost;
}

但是它说攻击和费用不属于卡牌。将卡片放在一个列表中而不是将它们分成两张对我来说很重要。

那是因为这些属性不是基础 class 卡片的一部分。如果 class B 和 C 都派生自 A,并且您的方法接受 A 类型的参数,则您只能使用 A 类型的成员而不是 B 和 C。要完成您想要的,您可以在基数 class 调用了 GetInfo()。然后,您可以在每个 class 中覆盖该方法以实现其指定的行为。当然还有许多其他(更好的?)方法可以做到这一点,但这与您尝试做的最相似。

只要按照您的要求进行操作,您就可以使 GetInfo 成为 Card 的抽象方法,并为继承 Card 的每个 类 编写功能,如下所示:

    abstract class Card
    {
        string name;

        abstract protected int GetInfo();
    }

    class Minion : Card
    {
        public int attack;

        protected override int GetInfo()
        {
            return this.attack;
        }
    }

    class Spell : Card
    {
        public int cost;

        protected override int GetInfo()
        {
            return this.cost;
        }
    }

    class Game
    {
        List<Card> cards;

        private void ReadCards()
        {
            cards = new List<Card>();
            //READ CARDS FROM DATABASE AND ADD TO COLLECTION
            //cards.Add(new Minion()) or cards.Add(new Spell())
        }
    }