2010-07-11 31 views
2

J'ai une classe à peu près Désignés comme tels:Comment puis-je utiliser une syntaxe d'initialisation de tableau pour une classe de vecteur personnalisée?

class Vector3 
{ 
    float X; 
    float Y; 
    float Z; 

    public Vector3(float x, float y, float z) 
    { 
     this.X = x; 
     this.Y = y; 
     this.Z = z; 
    } 
} 

je d'autres classes de mise en œuvre comme propriétés, par exemple:

class Entity 
{ 
    Vector3 Position { get; set; } 
} 

Maintenant, pour définir la position d'une entité, j'utiliser ce qui suit :

myEntity.Position = new Vector3(6, 0, 9); 

Je voudrais raccourcir cela pour l'utilisateur en implémentant un initialiseur de type tableau pour V ector3:

myEntity.Position = { 6, 0, 9 }; 

Cependant, aucune classe ne peut hériter des tableaux. De plus, je sais que je pourrais en quelque sorte réussi à obtenir cela avec hacks mineures:

myEntity.Position = new[] { 6, 0, 9 }; 

Mais ce n'est pas le point ici. :)

Merci!

Répondre

2

Il n'existe aucune syntaxe définie pour utiliser la syntaxe d'initialisation de tableau, sauf dans les tableaux. Comme vous faites allusion, cependant, vous pouvez ajouter un opérateur (ou deux) à votre type:

public static implicit operator Vector3(int[] value) 
    { 
     if (value == null) return null; 
     if (value.Length == 3) return new Vector3(value[0], value[1], value[2]); 
     throw new System.ArgumentException("value"); 
    } 
    public static implicit operator Vector3(float[] value) 
    { 
     if (value == null) return null; 
     if (value.Length == 3) return new Vector3(value[0], value[1], value[2]); 
     throw new System.ArgumentException("value"); 
    } 

vous pouvez utiliser:

obj.Position = new[] {1,2,3}; 

etc. Cependant, personnellement je venais de le laisser seul , comme:

obj.Position = new Vector3(1,2,3); 

qui implique moins de travail (aucune allocation/initialisation de tableau, aucun appel d'opérateur).

+0

J'ai dit que je pouvais déjà avoir ceci dans la question, mais ce n'est pas ce que je veux. Lisez attentivement s'il vous plaît. ^^ – Lazlo

+0

@Lazlo - merci, mais j'ai * lu * attentivement. Cela ne change pas le fait que non: sans de tels hacks vous ne pouvez pas le faire. –

0

Il y a 2 options:

1) Utiliser la syntaxe d'initialisation d'objet:

myEntity.Position = new Vector3(){ X = 6, Y = 0, Z = 9 }; 

2) Créer un contstructor qui prend un tableau:

Vector3(float[] array) 
{ 
    // Validate, set X = array[0] etc. 
} 

myEntity.Position = new Vector3(new float[3]{ 6, 0, 9}); 

Je ne sais pas si soit est plus facile que juste

myEntity.Position = new Vector3(6, 0, 9); 

Ce que vous avez déjà.

+0

+1 pour la syntaxe d'initialisation d'objet. De plus, si votre 'Vector3' est changé d'une classe à une structure, cette syntaxe appellera le constructeur' Vector3' par défaut. En tant que type de valeur, le constructeur par défaut peut être incorporé par le compilateur; Si vous créez plusieurs beaucoup de vos 'Vector3's par seconde, cela pourrait aider un peu. Voir: [Blog de Shawn Hargreaves: Inline These Vector Constructors] (http://blogs.msdn.com/b/shawnhar/archive/2007/01/02/inline-those-vector-constructors).aspx) –

+0

Aucun de ceux-ci ne réduit la quantité de code que l'utilisateur doit taper. – Lazlo

+0

@Lazlo à droite, comme je l'ai dit, votre constructeur est probablement aussi court que possible sans quelques astuces intelligentes. – TJB

1

Le point entier de la demande est de réduire la quantité totale de code. Il est simplement plus pratique de faire {1, 2, 3}. Il semble étrange que C# ne vous permette pas de surcharger les opérateurs pour ce faire, ou permettre une autre façon d'utiliser les initialiseurs de tableau pour les types de référence personnalisés.