2016-03-18 13 views
5

Şu anda XNA bir oyun üzerinde çalışıyorum ve ben şu yapmayı gitmeli nasıl emin değilim ...C# Subclass İyi Uygulama

Böyle

olarak binaların bir taban sınıf var
public class BuildingsBase 
    { 
    private int _hp; 
    public int hp 
    { 
     get { return _hp; } 
     set { _hp= value; } 
    } 

    private int _woodRequired; 
    public int woodRequired 
    { 
     get { return _woodRequired; } 
     set { _woodRequired = value; } 
    } 
    } 

Örneğin yapı türleri için birden fazla alt sınıfa sahip oldum.

public class TownHall:BuildingsBase 
{ 
    public int foodHeld; 

    public TownHall() 
    { 
     foodHeld = 100; 
     woodRequired = 500; 
    } 
} 

Sorum şu ki, alt sınıflar oluşturmak için varsayılan değerleri belirlemenin en iyi yolu nedir?

Örneğin, bir townhall için woodRequired 500 olarak ayarlanır ancak kodda çeşitli yerlerde ben (yapmak için yeterince odun var ise kontrol ederken) townhall örneğidir ilan var önce bu değeri erişmek gerekir.

Şu anda her bina türü için genel bir varsayılan değişken dizisi var, ancak bunu yapmanın daha iyi bir yolu olup olmadığını merak ediyorum.

if (Globals.buildingDefaults[BuildingType.Townhall].woodRequired < Globals.currentWood) 
{ 
    Townhall newTH = new Townhall(); 
} 
+1

Neden düşüş yok? Bence geçerli bir soru. – Caramiriel

+1

Neden başka bir şey yapmıyorsunuz? İlk önce ör. TownHall dahili ve daha sonra yeterli odun kullanılabilir değilse sadece 'woodRequired <= myCurrentWood' değerini kontrol tekrar nesneyi yok et. Tabii ki, çok fazla hesaplamayla büyük bir nesneye sahipseniz, bu yapılmamalıdır. Kullanıcı, zaten nesneyi tuttuğunuzu ve sadece .Show() veya bir şey çağırdığını bilmez. –

+0

İkinci fikir, int currentWood() 'işlevinin implementa olduğunu ve sadece nesnelerin yapıcısını kontrol etmektir, eğer yeterli odun yoksa, yaratmayı durdurabilirsiniz –

cevap

4

Genellikle ne olduysa, bir sineksiklet (see pattern) oluşturmaktır. Bu nesne, her durumda aynı olan özellikleri içerir. Her bir örnek için gereken odun miktarını ayrı ayrı değiştirmeye (veya aslında depolamaya) gerek yoktur. çok temel bir tasarımda

gibi görünecektir: Eğer böyle bir yöntem arar diye Sonunda

class BuildingTemplate 
{ 
    public int WoodRequired { get; set; } 
} 

class Templates 
{ 
    public static BuildingTemplate TownHall { get; set; } 
} 

: Elbette

public bool CanBuildTownHall(Player player) 
{ 
    return player.HasEnoughResources(Templates.TownHall); 
} 

Şablon için bir sözlük kullanabilir, erişim ve oyuncular bina gereksinimlerini gerçekten bilmemeli. Sadece deseni burada gösteriyorum.

Oynatıcıda yeterli kaynak varsa, kalıbı çıkarmak ve TownHall'un gerçek bir örneğini oluşturmak için şablonu kullanabilirsiniz. Asıl şablona referans olması güzel bir şeydir, çünkü muhtemelen tüm TownHall s için geçerli olan diğer global özelliklere de erişebilirsiniz (ses/görseller/... gibi).

class TownHall 
{ 
    public TownHall(BuildingTemplate template) 
    { 
     _template = template; 
    } 
} 
+0

Bunun için çok yararlı, küresel bir dizi için benzer bir yöntem gibi görünüyor ama daha az yükü ile görünüyor. – user3208483