2016-11-18 2 views
1

Ich suche nach einer Möglichkeit, Code zu bereinigen. Ich habe die untenAufrufen einer Methode beim Initialisieren von Objekt

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

Ich möchte den "Sprite" initialisieren, wenn Sie es in die Liste hinzufügen. Aber das Problem, das ich habe, ist die "SetInput" -Methode. Diese Methode ist optional.

Ich weiß, dass dies nicht syntaktisch korrekt ist, aber unten ist das, was ich rede

_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) }, 
    }; 

Wie Sie sehen, ich bin versucht, ein Verfahren in einer ähnlichen Art und Weise rufen Sie kann Eigenschaften festlegen.

Hier sind die Möglichkeiten, die ich um es zu bekommen

  1. Optionale Parameter Konstruktor für die Schlüssel

    public Sprite(Texture2D texture, Key? left, Key? right, Key? up, Key? down) 
    
  2. Ein zweiter Konstruktor mit den Tasten

    public Sprite(Texture2D texture, Key left, Key right, Key up Key down) 
    
  3. denke

    Erstellen eines Delegaten in der Klasse "Sprite", die beim Initialisieren zugewiesen wird ized und dann Schleife um alle _sprites,

Der Code Aufruf der Methode ich am Anfang gestellt habe, ist in Ordnung, ich frage mich nur, wenn eine ‚bessere‘ Art und Weise gibt es?

Danke.

+0

Ein zweiter Konstruktor die erwartete API würde sein wollen. –

+0

In diesem einfachen Fall würde ich wahrscheinlich mit einem zweiten Konstruktor gehen. Für Klassen mit vielen Optionen verwende ich generell eine Builder-Klasse mit Methodenverkettung: 'neuer Builder (). Position (...). Eingabe (...). Build()' – Lumen

+0

Natürlich, Sie können auch eine Wrapper-Klasse 'Input' erstellen, die vier Schlüssel enthält und dann eine Eigenschaft' Sprite.Input' hinzufügen, die 'SetInput' ersetzt. – Lumen

Antwort

1

Was ist mit dem Erstellen von Eingabeklasse, um es zu bereinigen?

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

dann werden Sie genau das bekommen, was Sie

_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

Ich sehe, ich sehe. Darum hat Lumen gesprochen. Ich mag das. Vielen Dank! – Oyyou

1

Sie auch genannt verwenden kann so „fließend“ Schnittstelle: wie diese

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

, die verwendet werden können, ob es „besser“ ist eine Frage des Geschmacks ist, aber es ist auf jeden Fall eine Option.

+0

Ich mag, was du hier sagst, und ich werde das für die Zukunft behalten, weil ich noch nie zuvor so etwas gedacht habe und noch etwas recherchieren werde. Dank dafür! – Oyyou

+0

Das heißt Fluent Interface (nicht "api" wie ich in der Antwort erwähnt), so Googeln mit diesem Schlüsselwörtern zu tun :) – Evk

Verwandte Themen