C#/ Unity3D - 所有子类的一个构造函数?

时间:2016-04-22 10:18:02

标签: c# unity3d

我是一个菜鸟,一个生锈的那个,所以在这里忍受我。我想制作一个旧的,模糊的纸牌游戏的数字实现。我有一个卡类型,其名称,稀有性,分类等属性。然后有更具体的东西,不是所有卡都有,如攻击力,资源成本等。命运卡没有有一个力量属性,行星卡没有影响力,等等。

我想把卡子分类到这些各种各样的卡片中,这些卡片只有他们拥有的相应属性,但我不想放弃使用一张新卡片(字符串名称)&# 34;构造函数。我的想法是让Card构造函数调用一个子类的构造函数,其中包含一般属性的参数,但我读到你不能从构造函数中返回任何东西,而不是正在构造的类型。干净利落的方式吗?

1 个答案:

答案 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”卡和两个组件)。但是,您需要某种方式将卡的名称与您希望它的组件相匹配。

希望它有所帮助!