Nesne

2011-05-12 26 views
7

i kendi içinde olan bir sınıfın örneğini üretmenin mümkün olup olmadığını benNesne

Sorunum i gezegenler & Verilerini i tutuyorum onların uyduları için 3D Küreleriyle oluşturarak ma ki ... düşünüyorum hey Nesnede. "Boyut" "Orbital Yarıçap" "Doku" "Devrim Hızı" etcetra için gezegen sınıfının kurucusuna parametreleri iletiyorum. Ay sınıfının tam bir kopyası olan Ay'ın Gezegenleri için başka bir sınıf yapmalıyım.

Sınıf nesnesini kendi içinde yapabilir miyim diye düşünüyordum. Bir nesne oluşturmak için "bir" oluşturmak için "1" geçecek ve ay ay hiçbir ayları için "0" geçecek aynı kurucu olacak gibi bir liste Nesnelerin dizi için bir parametre geçmek. yaratmak. Bu

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 
} 
  • gibi

    şey bazı nasıl mümkün mü?

  • veya Bu tür sorunlara en iyi uygulama yöntemi nedir?

P.S. C# & Microsoft X.N.A Çerçeve

+0

Neden denemek? Bu, yazdığınız gibi çalışır. (Tabii ki, 'while' döngü daha basit hale getirilebilir.) –

cevap

7

Evet, neden olmasın? Ancak, hem Planet hem de Moon sınıflarınızın kendiliğinden alacağı CelestialBody türünde bir temel sınıf oluşturmak isteyebilirsiniz. Ve yapıcı içine bir Planet 'ın Moon s geçmesi gerekmez, ama sadece böyle Planet görünüm yapabilirsiniz:

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

: o zaman

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

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

Ve böyle Moon s eklenir Örneğin Moon'dan bu yana bilgilerin bir kısmı Planet değildir.

+0

Josh'un yaklaşımı Söylemeye çalıştığım ne ile aynı işlevi görecektir. Her iki sınıfın ortak olduğu özellikler olacak. Ben Gezegen ve Uydu hem devralan bir taban sınıfı CelestrialBody rotasını gider - Ben bir arayüzü kullanmak istiyorum emin değilim. Gezegenin kendi ek özelliklerine sahip olması (Liste , Aphelion, Perihelion) ve Uydu'nun kendi özellikleri vardır (perigee, apogee). –

+0

Orijinal olarak da temel bir sınıf olarak aldım - ve muhtemelen bunu nasıl uygulayacağım. Bunun yerine taban sınıfı ile gitmek için –

+0

+1 :) –

0

Tabii kullanıyorum. Dersi tekrar kullanıyorsun. Sınıfın bazı özelliklerinin artık geçerli olmayacağını unutmayın (ayların uyduları diye bir şey yoktur, öyle mi?)

Bir boole, isChild geçiren bir kurucu eklemek isteyebilirsiniz. Bu şekilde yuvalanmış çocuk aslında bir çocuk olduğunun farkında olabilir.

+2

Moons aslında uyduları olabilir. – asawyer

0

Halihazırda oldukça doğru görünüyor. Bir olası iyileştirme, Moon adında yeni bir sınıf oluşturmak ve Planet'dan miras almayı gerektirir. Böylece, Planet'a ait bir referansı saklamak gibi Moon için ek özellikler/işlevler ekleyebilirsiniz.

0

Elbette, bu geçerli bir koddur.

Bu tür bir tasarım, diğer nedenlerle de sorgulanabilir. Bir Gezegen sınıfı neden diğer Gezegen örneklerinin vb. Nasıl oluşturulacağını bilir. Mantık yaratan gezegenler sınıf imo'nun dışındaysa daha nettir.

0

Kodunuz tamam olsa da, benim zevkim için bir infanite döngüye çok yakın bir şeymiş gibi görünüyor. Eğer o zaman 0 ile 1 arasında değiştiysen BANG!Bunu yapmanın bir yolu daha sağlam ekstra yapıcı oluşturmak ve bunları zincire olacaktır yapmak. Bu şekilde özyineleme yoktur.

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

Nesne yönelimli bir yaklaşım, ayın herhangi bir kodunu kendi sınıfına ayırabilir. Bu, kodunuzun büyüdükçe daha düzenli kalmasına yardımcı olabilir. Bir ayın gerçekten bir gezegen olmadığını biliyorum, ama kimin umurunda?

bu bir sakıncası ancak artık iheritance seçenekleri sınırlayıcı olduğunu, bu yüzden düşünmek zorunda kalacak bir tasarım karardır.

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