2016-04-22 7 views
0

私はノブで、それには錆びた人ですから、ここで私を抱きしめてください。私は古い、あいまいなカードゲームをデジタルで実装したいと考えています。私は名前、希少性、分類などの属性を持つカードタイプを持っています。それから攻撃力、資源費など、すべてのカードが持っていないより具体的なものがあります。運命カードには、惑星カードには影響力などがありません。C#/ Unity3D - すべてのサブクラス用に1つのコンストラクタ?

私は、これらの様々な種類のカードにカードをサブクラス化したいだけの特性を持っていますが、私は単一の「新しいカード(文字列名)」コンストラクタを諦めたくありません。私の考えは、一般的なプロパティの引数を持つサブクラスのコンストラクタをCardコンストラクタで呼び出させることでしたが、構築されている型以外のコンストラクタからは何も返すことができません。これをきれいにする方法はありますか?

+0

コンストラクタと同じパラメータを持ち、正しい種類のカードの新しいインスタンスを吐き出す 'public CardFactory(....')メソッド – spender

+0

ああ、あなたは、どのコンストラクタを – NoSoup4you

+0

はい、あなたは正しいです。それは単に 'Card'を返すメソッドであり、それを使って、新しいインスタンスを使用して返します。 – spender

答えて

1

私はよく理解していれば、何を終わりにしたいと、このようなものになるだろう:基本クラスのコンストラクタを呼び出すことはできませんとして継承を使用してのあなたの計画は、このように動作しません

Card planetCard = new Card("Planet"); 
Card fateCard = new Card("Fate"); 

継承したクラスを独自のコストラクターから削除します。それは逆にしか起こりえない。

1-必要に応じてプロッパクラスをインスタンス化します。。次のようになりました(一種のあなたが最初の場所で実現したかったものと同様である)カードを作成することができます

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つのクラスを考えると

2-継承の代わりにコンポーネントを使用する。

継承の代わりにコンポーネントを使用することは、今日ゲームでは非常に一般的です。アイデアは、1枚のカードだけクラスを持つが、各カード、それが本当に何であるかに応じて、使用する別のコンポーネント必要がありますされています

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 
    } 
} 

をそして今、あなたは後で使用していますが、最初の場所(のようにカードを作成することができます)少し異なるものになります:それはあなたが(あなたが望んでいた場合は、両方のコンポーネントで「FatePlanet」カードを持っているclud)の意志でコンポーネントを組み合わせることができますよう

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 
} 

このソリューションは、はるかに柔軟です。あなたはそれが必要なコンポーネントとカードの名前を一致させる何らかの方法が必要です。

希望すると助かります!

関連する問題