2017-06-30 5 views
0

を型チェックせずに、実行時にジェネリック型の新しいインスタンスを作成します。は、次のような設計は、単に私の問題を表示するためのテンプレートです

public interface IHero 
{ 
    string Name { get; } 
    int Level { get; } 
} 
public interface IWarlock : IHero 
{ 
    string MagicType { get; } 
} 
public interface IKnight : IHero 
{ 
    string CommandHierarchy { get; } 
} 
public class Warlock : IWarlock, IHero 
{ 

    string IWarlock.MagicType { get { throw new NotImplementedException(); } } 

    string IHero.Name { get { throw new NotImplementedException(); } } 

    int IHero.Level { get { throw new NotImplementedException(); } } 

    public Warlock(string name, int level, string magicType) 
    { 

    } 
} 
public class Knight : IKnight, IHero 
{ 

    string IKnight.CommandHierarchy { get { throw new NotImplementedException(); } } 

    string IHero.Name { get { throw new NotImplementedException(); } } 

    int IHero.Level { get { throw new NotImplementedException(); } } 

    public Knight(string name, int level, string commandHierarchy) 
    { 

    } 
} 
public class NullHero : IHero 
{ 

    public string Name { get { return string.Empty } } 

    public int Level { get { return -1; } } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 

    } 
    //Increments the hero's level. 
    static IHero LevelUp(IHero hero) 
    { 
     if (hero is IWarlock) 
      return new Warlock(hero.Name, hero.Level + 1, (hero as IWarlock).MagicType); 
     else if (hero is IKnight) 
      return new Knight(hero.Name, hero.Level + 1, (hero as IKnight).CommandHierarchy); 
     else 
      return new NullHero(); 
    } 
} 

問題は、私は新しいヒーローを追加し、次の時間が、私はif文LevelUp機能に別のものを追加する必要がありますし、これが厄介になることです。私は、新しいインスタンスを作成するためにActivator.CreateInstanceを使用することができます知っている

しかし二つの問題、1.すべてのオブジェクトは不変です。 2.コンストラクタ内のパラメータの数とタイプ。

誰もがこの問題の解決策を提案してくださいもらえますか?

EDIT: はい、コメント欄では誰もが正しいです。 LevelUpをIHeroインターフェイスの定義として追加することができます。

は、たぶん私は私の問題を伝えるが、のは、私はテンプレートに示すように外LevelUpを処理したいと仮定しましょうし、間違った概念を選びました。タイプチェックをしなくてもタイプIHeroの新しいインスタンスを作成するという私の唯一の問題に取り組む方法はありますか?

+3

IHeroにLevelUpの定義を入れないのはなぜですか?どの実装でも 'this'を返すだけです(本当に何かを返す必要があるかどうかは疑問です)。 – pijemcolu

+0

私はあなたがIHeroを実装するクラスを持っていて、あなたのヒーローの両方がそのクラスを継承すべきだと思います。今すぐあなたはすべての新しいサブヒーロータイプでヒーローをリファイナライズします。彼らはすべて同じ性質を持っています(名前とレベル)。また、あなたのレベルアップ機能は、あなたがヒーロー全体を与え、それがヒーローを戻すので、奇妙に見えます。 IHeroで "LevelUp()"のようなメソッドを作成し、そこから実行します。 – user5014677

+0

@pijemcoluはい、この場合は可能です。これはIHeroの定義としてLevelUpを持つことに意味があるからです。しかし、私はこれが単なる単純なテンプレートだと言ったように。私のビジネスロジックははるかに複雑です(私はこれを明らかにすることはできません)が、問題は同じです。多分私が求めていることは実行できませんが、私はコミュニティとそれを確認する必要がありました。 –

答えて

0

あなたのオブジェクトは不変であり、あなたはあなたがIHeroインタフェースにLevelUpメソッドを追加するのがベストでしょう、各ヒーローのための特定のクラスのロジックを自分のレベルを維持したいので。

public interface IHero 
{ 
    string Name { get; } 
    int Level { get; } 
    IHero LevelUp(); 
} 

特定のヒーロークラスでは、LevelUpメソッドを実装します。

public IHero LevelUp() 
{ 
    return new Warlock(this.Name, this.Level + 1, this.MagicType); 
} 

静的な梁の機能を下位互換性のために維持できますが、それをリファクタリングする必要があります。

static IHero LevelUp(IHero hero) 
{ 
    return hero.LevelUp(); 
} 
+0

質問の編集部分をお読みください –

+0

オブジェクトをバイナリにシリアル化してデシリアライズし、レベルをインクリメントすることができると思います...それはどんな型であってもオブジェクトの新しいインスタンスを作成します。 –

+0

ありがとう、私はそれを調べます。 –

関連する問題