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())
}
}
我有一个名为 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())
}
}