Gameprogrammeren: Properties Arjan Egges Paul Bergervoet Wouter van Toll
Motivatie Stel we willen de positie van een Player veranderen van buitenaf Optie 1: public membervariabele public class Player { public Vector2 position; ... } Player player = new Player(); player.position = new Vector(10,10); player.position.X = 20;
Mag niet: Player.position is private Motivatie Maar wat als we checks willen toevoegen? Bijvoorbeeld: positie moet in het level passen Optie 2: private variabele, public methodes public class Player { private Vector2 position; ... public void SetPosition(Vector2 p) { position = p; if (position.X < 0) { ... } } public Vector2 GetPosition() { return position; Player player = new Player(); player.position = new Vector(10,10); player.SetPosition(new Vector(10,10)); Vector2 p = Player.GetPosition(); Mag niet: Player.position is private
Properties Dit ‘getten’ en ‘setten’ komt zo vaak voor dat C# er een alternatief voor heeft: Optie 3: properties public class Player { public Vector2 Position { get; set { Position = value; if (Position.X < 0) { ... } } ... Vector2 p = player.Position; Player.Position = new Vector2(10,10); (Conventie: properties met hoofdletter) In plaats van GetPosition() In plaats van SetPosition(…) Speciaal keyword binnen set: de waarde die de aanroeper meegeeft Roept de getter aan Roept de setter aan, met al z’n checks
Properties Property = een eigenschap van een object die je kunt getten en (optioneel) setten Heeft vaak te maken met een membervariabele die je niet direct mag inzien Je kunt extra gedrag inbouwen in get/set
Voorbeeld, uitgebreid Private membervariabele, public property public class Player { private Vector2 position; public Vector2 Position get return position; } set position = value; if (position.X < 0) { ... }
get en set Sommige properties mag je alleen lezen (get) String.Length Viewport.Width Sommige properties mag je ook schrijven (set) Vector2.X Content.RootDirectory Cannon.Color
Properties vs membervariabelen Properties hoeven niet altijd direct met een waarde van een membervariabele te corresponderen (Zulke properties hebben vaak alleen een getter) public Vector2 Center { get return new Vector2(sprite.Width, sprite.Height) / 2; }
Properties in properties Ander voorbeeld van een property: `TotalGameTime’ is een property van een GameTime-object en geeft de totaal gepasseerde tijd aan De gepasseerde tijd heeft zelf het type TimeSpan En een TimeSpan-object heeft weer een property `Milliseconds’ gameTime.TotalGameTime gameTime.TotalGameTime.Milliseconds Type: int
Static properties Net als een methode kan een property static zijn Dit is geen property van een specifiek object, maar van de gehele klasse van objecten (Anders gezegd: hoort bij een type, en niet bij een variabele van een type) Voorbeeld in MonoGame: Color.Olive (en andere ingebouwde kleuren) Roept stiekem een get-methode aan die creëert: Werkt als een soort constante new Color(128, 128, 255)
Static en niet-static properties De property `Olive’ hoort bij het type `Color’ De property `TotalGameTime’ hoort bij een variabele van het type `GameTime’ De property `R’ hoort ook bij een variabele van het type `Color’ Dus dit mag niet: Color.Olive gameTime.TotalGameTime Color.R
Property, public variabele, of get/set-methodes? Officieel kan het allemaal: je mag zelf kiezen Een property staat “netter” dan direct een variabele bewerken Handige shorthand voor als je iets niet wilt opslaan, maar alleen soms opvragen Zoals het Center-voorbeeld Een klasse wordt netter met een getter of setter