我是一个菜鸟,一个生锈的那个,所以在这里忍受我。我想制作一个旧的,模糊的纸牌游戏的数字实现。我有一个卡类型,其名称,稀有性,分类等属性。然后有更具体的东西,不是所有卡都有,如攻击力,资源成本等。命运卡没有有一个力量属性,行星卡没有影响力,等等。
我想把卡子分类到这些各种各样的卡片中,这些卡片只有他们拥有的相应属性,但我不想放弃使用一张新卡片(字符串名称)&# 34;构造函数。我的想法是让Card构造函数调用一个子类的构造函数,其中包含一般属性的参数,但我读到你不能从构造函数中返回任何东西,而不是正在构造的类型。干净利落的方式吗?
答案 0 :(得分:1)
如果我理解得很清楚,你最终想要的是:
Card planetCard = new Card("Planet");
Card fateCard = new Card("Fate");
您使用继承的计划不会以这种方式工作,因为基类不能从其自己的costructor中调用继承类的构造函数。它只能以相反的方式发生。解决这个问题的两个更简单的选择是:
1-根据需要实例化propper类。
给出两个这样的类:
public class PlanetCard : Card
{
///--- Attributes of planet here
public PlanetCard() : base("Planet"){}
}
public class FateCard : Card
{
///--- Attributes of fate here
public FateCard() : base("Fate"){}
}
您现在可以按照以下方式创建卡片(这类似于您首先想要实现的卡片):
Card planetCard = new PlanetCard();
Card fateCard = new FateCard();
2-使用组件而不是继承。
现在,当涉及到游戏时,使用组件而不是继承是非常常见的。这个想法只有一个Card类,但是根据它的真实含义,每张卡都有不同的组件可供使用:
interface IComponent{}
public class PlanetComponent : IComponent
{
///--- Attributes of Planet
}
public class FateComponent : IComponent
{
///--- Attributes of Fate
}
public class Card
{
List<IComponent> components;
public Card(string cardName)
{
///--- Fill components according to the name
}
public T GetComponent<T>()
{
///--- return the component of the type T in the list, or null
}
}
现在你可以像第一个一样创建卡片(虽然稍后会有所不同):
Card planetCard = new Card("Planet");
Card fateCard = new Card("Fate");
///--- Using the planet card
PlanetComponent planetComp=planetCard.GetComponent<PlanetComponent>();
if (planetComp!=null)
{
///--- you can use here the planet attributes
}
这个解决方案更加灵活,因为它允许您随意组合组件(如果需要,您可以使用“FatePlanet”卡和两个组件)。但是,您需要某种方式将卡的名称与您希望它的组件相匹配。
希望它有所帮助!