7
votes

Objet d'une classe en soi

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.

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.

quelque chose comme ça xxx

  • Est-ce que c'est que possible?

  • ou quelle est la meilleure pratique \ approche de ce type de problème?

    P.S J'utilise C # & Microsoft X.N.A Framework


1 commentaires

Pourquoi ne pas l'essayer? Cela fonctionne comme si vous avez écrit. (Bien sûr, le tandis que la boucle peut être simplifié.)


6 Réponses :


0
votes

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à?)

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.


1 commentaires

Les lunes peuvent en fait avoir des lunes.



7
votes

Oui, pourquoi pas? Mais vous voudrez peut-être faire une classe de base de type 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é>

puis ajouter moon code> s comme ceci: p>

myPlanet.Moons.Add(new Moon(...));


4 commentaires

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 , Aphelion, Perihelion) et Satellite aurait ses propres propriétés (Perigee, Apogee).


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 aide à plus de 100 méthodes d'emballage lors de la réalité, il n'est pas différent de myplanet.mons.add (... ) (Eh bien, c'est un caractère supplémentaire).



0
votes

Ce que vous avez déjà semble déjà précis. Une amélioration possible serait de faire une nouvelle classe appelée moon et de l'avoir hériter de planet . De cette façon, vous pouvez ajouter des propriétés / fonctionnalités supplémentaires pour Moon , telles que la conservation d'une référence à la planète . .


0 commentaires

0
votes

Bien sûr, il s'agit de code valide.

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.


0 commentaires

0
votes

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


0 commentaires

2
votes

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. < Pré> xxx


0 commentaires