Sellainen kysymys heräsi C#:n syntaksiin liittyen, että onko mahdollista tehdä sellaisia settereitä, käyttämällä C#:n omaa notaatiota eli set-lohkoa, että pystyisin asettamaan esim. vain toisen Vector2-olion komponenteista?
Voithan sijoittaa setterissä arvon oikeastaan mihin tahansa. Voisitko tarkentaa kysymystä? Kirjoita malliksi vaikka metodit, jotka haluaisit korvata jollain setterillä.
En tiedä mitä kysyt, vastaan silti: Named and Optional Arguments (C# Programming Guide)
ilmeisesti kyse on XNA Frameworkista?
http://msdn.microsoft.com/en-us/library/bb199660(v=xnagamestudio.35).aspx
käytät vain tuota yhden floatin constructoria (se asettaa molempiin komponentteihin saman arvon)
tietenkin voit itse tehdä oman luokan, jolla voit asettaa vain toisen arvon.
//Notepad viritys, en pääse nyt testaamaan. Mutta jotain tän suuntaista: public class MyVector2 { private float _x; private float _y; public float x { set { _x = value; } get { return _x; } } public float y { set { _y = value; } get { return _y; } } public static implicit operator Vector2(MyVector2 MV) { Vector2 v = new Vector2(MV.x, MV.y); return v; } public MyVector2(float X, float Y) { x = X; y = Y; } } class Program { static void Main(string[] args) { MyVector2 MV = new MyVector2(12,12); //v.UnitX = 12, v.UnitY = 12 Vector2 v = MV; MV.x = 14; //v.UnitX = 14, v.UnitY = 12 v = MV; MV.y = 16; //v.UnitX = 14, v.UnitY = 16 v = MV; MV.y = 200; MoveToSomething(MV); MV.x = 212; MoveToSomething(MV); } private void MoveToSomething(Vector2 v) { //.... } }
Toki voit myös tehdä extension methodin, jossa voit määrätä vain toisen arvoista (palautat uuden Vector2:sen joka sisältää esim. vanhan x:n ja uuden y:n) (http://msdn.microsoft.com/en-us/library/vstudio/bb383977.aspx)
Tarkoitan siis tätä:
// Eli jos mulla on vaikka seuraavanlainen luokka: namespace MyGame { class Player { Vector2 position; public Vector2 Position { set { this.position = value; } get { return this.position; } } } } // ja haluaisin muuttaa mun Player-olion jompaakumpaa komponenttia. Näin: Player player = new Player(); player.Position.X = 10; // nythän tuo onnistuu vain niin, että // asetetan näin: player.Position = new Vector2( 0f, 0f );
no jos sovellat vastaavaa kuin tuossa yllä näytin, niin Position objektisi voisi olla vaikak tuo MyVector2, jolloin käyttäisit sitä player.Position.x = 10;
Vector2 objektiin et voi vaihtaa suoraan vain toista komponenttia.
class Player { public MyVector2 Position; public Player(float defaultX,float defaultY) { //alkukoordinaatit Position = new MyVector2(defaultX,defaultY); } } //Position.x = 10, Position.y=10 Player player = new Player(10,10); //Position.x = 200, Position.y = 10 player.Position.x = 200; Vector2 CurrentPosition = player.Position; //ja voihan sulla olla suoraan tämmöinenkin: public class Player { public float x; public float y; public Player(float DefaultX, DefaultY) { x = DefaultX; y = DefaultY; } public Vector2 Position { get { return new Vector2(x,y); } set { Vector2 v = value; x = v.UnitX; y = v.UnitY; } } //jolloin käyttö on; Player player = new Player(5,5); player.x = 10; player.y = 20; Vector2 Position = player.Position; }
Vähän vanha aihe, mutta jos joku vielä tarvii. Yksi vaihtoehto on toteuttaa myös näin:
public class Player { private Vector2 position; public Player Player() { this.Position = new Vector2(null, null); // En kerennyt testaan kelpaako // null arvo, mutta sitten 0,0 } public Vector2 Position { get { return this.position; } set { this.position = value; } } } // Ja sitten käytetään jossain: Player player = new Player(); player.Position.X = 10;
Tosin jos alustus hyväksyy null arvon, niin sitä ei voi käyttää missään, mutta näin ainakin pystyy asettaan molemmat arvot erikseen
Ei pysty, Vector2.X ja Vector2.Y sisältävät vain Getin.
Hö
Aihe on jo aika vanha, joten et voi enää vastata siihen.