2011-05-12 10 views
7

hey yo estoy pensando si podía hacer instancia de una clase en sí mismo con ...objeto de una clase en sí

Mi problema es que la creación de I m Esferas 3D de planetas & sus lunas cuyos datos deposito a diario en Object. Paso parámetros al constructor de mi clase planetaria para "Tamaño" "Radio orbital" "Textura" "Revolution Speed" etcetra. Tengo que hacer otra clase para Moon's of Planets, que es un duplicado exacto de la clase de la luna.

Estaba pensando si podía hacer la clase de objeto en sí mismo. Pase un parámetro para list \ array of Objects of itself para crear y como Earth, pasaré "1" para crear una luna y como la luna tendrá el mismo constructor, pasaré "0" por no tener lunas de luna. crear.

Algo como esto

class Planet 
{ 
    Model  u_sphere; 
    Texture2D u_texture; 
    //Other data members 

    List<Planet> Moons = new List<Planet>(); 

    Planet() 
    { 
    //Default Constructor 
    } 

    //Overloaded\Custom Constructor 
    Planet(Model m, Texture2D t, int moon_count) 
    { 
     u_sphere = m; 
     u_texture = 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,0); 
      Moons.Add(temp); 
      moon_count--; 
     } 
    } 
    //Others Getters & Setters 
} 
  • ¿Es posible de alguna forma?

  • o ¿Cuál es el mejor práctica \ acercamiento a este tipo de problema?

p.s estoy usando C# & Microsoft Framework X.N.A

+0

¿Por qué no lo probar? Esto funciona tal como lo has escrito. (Por supuesto, el ciclo 'while' puede simplificarse). –

Respuesta

7

Sí, ¿por qué no? Pero es posible que desee crear una clase base del tipo CelestialBody desde la que entren sus clases Planet y Moon. Y usted no tiene que pasar un Planet 's Moon s en el constructor, pero se puede simplemente hacer Planet tener este aspecto:

public class Moon : CelestialBody 
{ 
    //Moon-only properties here. 
} 

public class Planet : CelestialBody 
{ 
    //Planet-only properties here. 
    public List<Moon> Moons { get; set; } 
} 

y luego añadir Moon s como esto:

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

P.ej abstract-away parte de la información ya que Moon no es Planet.

+0

El enfoque de Josh logra lo mismo que lo que estaba tratando de decir. Habrá atributos que ambas clases tienen en común. No estoy seguro de que usaría una interfaz: iría por la ruta de una clase base CelestrialBody de la que tanto Planet como Satellite heredan. Planet tendría sus propias propiedades adicionales (List , Aphelion, Perihelion) y Satellite tendría sus propias propiedades (perigeo, apogeo). –

+0

Lo tenía como una clase base originalmente, también, y esa es probablemente la forma de implementarlo. –

+0

+1 para ir con la clase base en su lugar :) –

0

Claro. Solo estás reutilizando la clase otra vez. Tenga en cuenta, que algunas propiedades de la clase ya no se pueden aplicar (no hay tal cosa como lunas de lunas, ¿verdad?)

Es posible que desee añadir un constructor que pasa un booleano, isChild. De esa forma, el niño anidado puede darse cuenta de que efectivamente es un niño.

+2

Las lunas pueden tener lunas. – asawyer

0

Lo que tienes ya parece bastante exacto. Una mejora posible sería crear una nueva clase llamada Moon y heredarla de Planet. De esta forma, puede agregar propiedades/funcionalidades adicionales para Moon, como almacenar una referencia a la propiedad Planet.

0

Por supuesto, este es un código válido.

Este tipo de diseño puede ser cuestionable por otras razones sin embargo. ¿Por qué una clase Planet sabría cómo crear otras instancias de Planet, etc.? Es mucho más claro si la lógica que crea los planetas está fuera de la clase imo.

0

Mientras que el código está bien, sólo parece que es un poco demasiado cerca de un bucle infanite para mi gusto. Si alguna vez cambiaste ese 0 a un 1, ¡BANG!Una forma de hacer esto más robusto sería crear un constructor adicional y encadenarlos. De esta manera no hay recursión.

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

Un enfoque más orientado a objetos podría ser separada cualquier código específico de luna en su propia clase. Esto podría ayudar a mantener su código más organizado a medida que se hace más grande. Sé que una luna no es realmente un planeta, pero ¿a quién le importa?

Sin embargo, un inconveniente es que ahora está limitando sus opciones de herencia, por lo que es una decisión de diseño en la que debería pensar.

class Planet 
{  
    Model  u_sphere; 
    Texture2D u_texture; 
    List<Planet> Moons = new List<Planet>(); 

    Planet(){} 

    Planet(Model m, Texture2D t, int moon_count)  
    { 
     u_sphere = m; 
     u_texture = t; 

     while(moon_count > 0)   
     { 
      Planet temp  = new Moon(); 
      Moons.Add(temp); 
      moon_count--; 
     }  
    } 
} 


class Moon : Planet 
{ 
    Moon() 
    { 
     u_sphere = LoadMesh("moon.x"); 
     u_texture = LoadTexture("moon.bmp"); 
    } 
} 
Cuestiones relacionadas