2016-11-18 11 views
1

私はいくつかのコードをクリーンアップする方法を検討しています。私は以下を持っていますオブジェクトを初期化するときにメソッドを呼び出す

var sprite1 = new Sprite(_content.Load<Texture2D>("Content/Block.png")); 
    sprite1.Position = new Vector2f(100, 100); 
    sprite1.SetInput(Key.A, Key.D, Key.W, Key.S); 

    var sprite2 = new Sprite(_content.Load<Texture2D>("Content/Block.png")); 
    sprite2.Position = new Vector2f(200, 100); 
    sprite2.SetInput(Key.Left, Key.Right, Key.Up, Key.Down); 

    _sprites = new List<Sprite>() 
    { 
    sprite1, 
    sprite2, 
    }; 

リストに追加するときに「スプライト」を初期化したいと思います。しかし、私が抱えている問題は、 "SetInput"メソッドです。その方法はオプションです。

私は、これは文法的に正しくないですけど、下の私が話している事の並べ替えは約

_sprites = new List<Sprite>() 
    { 
    new Sprite(_content.Load<Texture2D>("Content/Block.png")) { Position = new Vector2f(100, 100), SetInput(Key.A, Key.D, Key.W, Key.S) }, 
    }; 

あなたは私が道に似た方法を呼び出そうとしています見ることができるようにしますプロパティを設定できます。ここで

私はキー

public Sprite(Texture2D texture, Key? left, Key? right, Key? up, Key? down) 
  • のためのオプションのパラメータのコンストラクタキー

    public Sprite(Texture2D texture, Key left, Key right, Key up Key down) 
    
  • を有する第二のコンストラクタ

    その周り
    1. を得ると思っています方法があります

      「スプライト」クラスのデリゲートを作成します化され、その後、すべての_sprites周りのループ、方法

    私は開始時に置かれているコードを呼び出す「より良い」方法がある場合、私はちょうど思ったんだけど、大丈夫ですか?

    ありがとうございました。

  • +0

    第二コンストラクタが最も期待されるAPIになりたい正確に何を得るでしょう。 –

    +0

    この単純なケースでは、おそらく2番目のコンストラクタを使用します。多くのオプションがあるクラスの場合、私は一般的にメソッドチェインを持つビルダークラスを使います: 'new Builder(<必須の引数>)Position(...)。Input(...)。Build()' – Lumen

    +0

    もちろん、 4つのキーを保持するラッパークラス 'Input'を作成し、' SetInput'を置き換える 'Sprite.Input'プロパティを追加することもできます。 – Lumen

    答えて

    1

    入力クラスを作成してクリーンアップするのはどうですか?

    internal class Sprite 
    { 
        public Input Input { get; set; } 
        ... 
    } 
    
    internal class Input 
    { 
        public Key Left { get; private set; } 
        public Key Right { get; private set; } 
        public Key Up { get; private set; } 
        public Key Down { get; private set; } 
    
        public Input(Key left, Key right, Key up, Key down) 
        { 
         Left = left; 
         Right = right; 
         Up = up; 
         Down = down; 
        } 
    } 
    

    その後、あなたは

    _sprites = new List<Sprite>() 
    { 
        new Sprite(_content.Load<Texture2D>("Content/Block.png")) 
        { 
         Position = new Vector2f(100, 100), 
         Input = new Input(Key.A, Key.D, Key.W, Key.S), 
        }, 
    }; 
    
    +0

    私は見る。これがルーメンの話です。私はそれが好きです。ありがとうございました! – Oyyou

    1

    また、そう、「流暢」インターフェースと呼ばれる使用することができます:それはあるかどうか、この

    _sprites = new List<Sprite>() 
        { 
         new Sprite(_content.Load<Texture2D>("Content/Block.png")) 
          .SetPosition(new Vector2f(100, 100)) 
          .SetInput(Key.A, Key.D, Key.W, Key.S) 
        }; 
    

    のように使用することができ

    public class Sprite { 
        public Sprite SetPosition(Vector2f vector) { 
         // set 
         return this; 
        } 
    
        public Sprite SetInput(Key left, Key right, Key up Key down) { 
         // set 
         return this; 
        } 
    } 
    

    は、「より良い」好みの問題ですが、それはdefinetlyですオプション。

    +0

    私はあなたがここで言っていることが好きです、そして、私はこれまでのようなことを考えたことがないので、これを未来の心にしておきます。ありがとう! – Oyyou

    +0

    それは流暢なインターフェイス(私は答えで言及したように "API"ではなく)と呼ばれているので、このキーワードでグーグルが行います:) – Evk

    関連する問題