Hey je pense que si je pouvais faire une instance d'une classe avec elle-même ...
Mon problème est que je crée des sphères 3D pour les planètes et leurs lunes dont les données que je tiens à l'objet. Je passe des paramètres sur le constructeur de ma classe de planète pour "Taille" "Rayon orbital" "Texture" "Vitesse de la révolution" etcetra. Je dois faire une autre classe pour la lune de planètes, ce qui est un dupliqué exact de la classe de la lune. P>
Je pensais si je pouvais faire l'objet de la classe en lui-même. Passez un paramètre pour la liste \ Tableau d'objets d'elle-même pour créer et aimer la Terre, je vais passer "1" pour créer une lune et que la lune aura le même constructeur, je passerai "0" pour aucune lunaire de lune. créer. p>
quelque chose comme ça p> Est-ce que c'est que possible? p> li>
ou quelle est la meilleure pratique \ approche de ce type de problème? p> li>
ul> P.S J'utilise C # & Microsoft X.N.A Framework P> P>
6 Réponses :
Bien sûr. Vous venez de réutiliser la classe à nouveau. N'oubliez pas que certaines propriétés de la classe ne peuvent plus appliquer (il n'y a pas de lunes de lunes, est là?) P>
Vous voudrez peut-être ajouter un constructeur qui transmet un booléen, Ischild. De cette façon, l'enfant imbriqué peut être conscient que c'est en effet un enfant. P>
Les lunes peuvent en fait avoir des lunes.
Oui, pourquoi pas? Mais vous voudrez peut-être faire une classe de base de type puis ajouter Celestialbody code> à partir de laquelle votre
planet code> et
moon code> Les classes seront inhérées. Et vous n'avez pas besoin de passer un
planet code> 'S code> s dans le constructeur, mais vous pouvez simplement créer
planet code> ressembler à ceci: xxx pré>
moon code> s comme ceci: p>
myPlanet.Moons.Add(new Moon(...));
L'approche de Josh accomplit la même chose que ce que j'essayais de dire. Il y aura des attributs que les deux classes ont en commun. Je ne suis pas sûr que j'utiliserais une interface - j'irais la route d'une classe de base Celetrialbody que la planète et le satellite héritent de. Planet aurait alors ses propres propriétés supplémentaires (liste
Je l'ai eu comme une classe de base à l'origine, et c'est probablement comment je voudrais le mettre en œuvre.
Il simplifie la réponse, de toute façon.
@Amitd - Bien sûr, cela pourrait être quelque chose que vous ajoutez. Mais en supposant que le modèle de données soit plus grand que ce qui est montré ici, que addmoon code> aide à plus de 100 méthodes d'emballage lors de la réalité, il n'est pas différent de
myplanet.mons.add (... ) code> (Eh bien, c'est un caractère i> supplémentaire).
Ce que vous avez déjà semble déjà précis. Une amélioration possible serait de faire une nouvelle classe appelée moon code> et de l'avoir hériter de
planet code>. De cette façon, vous pouvez ajouter des propriétés / fonctionnalités supplémentaires pour
Moon code>, telles que la conservation d'une référence à la planète code>. P>.
Bien sûr, il s'agit de code valide. p>
Ce type de conception pourrait être discutable pour d'autres raisons. Pourquoi une classe de planète pourrait-elle savoir comment créer d'autres instances de planète, etc. Il est beaucoup plus clair que si la logique créant des planètes est en dehors de la classe IMO. P>
Bien que votre code est correct, il semble que c'est un peu trop proche d'une boucle infanite à mon goût. Si jamais vous avez changé cela 0 à un 1 puis bang! Une façon de rendre cela plus robuste serait de créer un constructeur supplémentaire et de les chaîner. De cette façon, il n'y a pas de récursion.
Planet(Model m, Texture2D t, int moon_count) : this(m, t) { while(moon_count > 0) { Model moon_sphere = LoadMesh("moon.x"); Texture2D u_texture = LoadTexture("moon.bmp"); Planet temp = new Planet(moon_sphere, moon_texture); Moons.Add(temp); moon_count--; } } Planet(Model m, Texture2D t) { u_sphere = m; u_texture = t; }
Une approche plus orientée objet pourrait être séparément n'importe quel code spécifique de la lune dans sa propre classe. Cela pourrait aider à garder votre code plus organisé car il devient plus grand. Je sais qu'une lune n'est pas vraiment une planète, mais qui se soucie?
Un inconvénient pour cela, c'est que vous limitez vos options d'iheritance, il s'agit donc d'une décision de conception que vous devriez penser. P> < Pré> xxx pré> p>
Pourquoi ne pas l'essayer? Cela fonctionne comme si vous avez écrit. (Bien sûr, le
tandis que la boucle code> peut être simplifié.)