本身的对象本身

时间:2011-05-12 13:07:39

标签: c# oop xna

嘿,我在想,如果我能够自己创造一个班级的实例......

我的问题是我为行星创建3D球体&他们的卫星数据我保留在对象中。我将参数传递给我的行星类的构造函数为“大小”“轨道半径”“纹理”“革命速度”etcetra。我必须为Moon的行星制作另一个课程,它与月球课程完全相同。

我在想是否可以在自己内部创建类对象。传递一个参数列表\对象的数组自己创建和喜欢为地球我将通过“1”创建一个月亮,因为月亮将具有相同的构造函数我将传递“0”没有月亮的卫星。创造。

像这样的东西

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
}
  • 有可能吗?

  • 或解决此类问题的最佳做法是什么?

p.s我正在使用C#&amp; Microsoft X.N.A框架

6 个答案:

答案 0 :(得分:7)

是的,为什么不呢?但是,您可能希望创建一个CelestialBody类型的基类,您的PlanetMoon类都将在其中。而且您不必将Planet的{​​{1}}传递给构造函数,但您可以使Moon看起来像这样:

Planet

然后像这样添加public class Moon : CelestialBody { //Moon-only properties here. } public class Planet : CelestialBody { //Planet-only properties here. public List<Moon> Moons { get; set; } }

Moon

E.g。摘要一些信息,因为myPlanet.Moons.Add(new Moon(...)); 不是Moon

答案 1 :(得分:2)

更加面向对象的方法可以将任何特定于月亮的代码分离到其自己的类中。这可能有助于使代码在变大时更加有条理。我知道月亮不是真正的星球,但谁在乎?

然而,这方面的缺点是你现在限制你的继承选项,所以这是一个你必须考虑的设计决定。

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

答案 2 :(得分:0)

不确定。你只是再次重复使用这门课程。请记住,班级的某些属性可能不再适用(没有卫星卫星,是吗?)

您可能想要添加一个传递布尔值isChild的构造函数。这样,嵌套的孩子可以意识到它确实是一个孩子。

答案 3 :(得分:0)

你已经看到的非常准确。一个可能的改进是创建一个名为Moon的新类,并让它继承自Planet。这样,您就可以为Moon添加其他属性/功能,例如存储对拥有Planet的引用。

答案 4 :(得分:0)

当然,这是有效的代码。

但是,出于其他原因,这种类型的设计可能会有问题。为什么Planet类知道如何创建其他Planet实例等。如果创建行星的逻辑在类imo之外,那就更清楚了。

答案 5 :(得分:0)

虽然你的代码还可以,但看起来它似乎有点太接近于我的品味的infanite循环了。如果你把那个0改为1则那么BANG!使这更加健壮的一种方法是创建一个额外的构造函数并将它们链接起来。这种方式没有递归。

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