2016-03-18 29 views
5

Tôi hiện đang làm việc trên một trò chơi trong XNA và tôi không chắc chắn về cách tôi nên đi về cách làm như sau ...C# Subclass Thực hành tốt nhất

Tôi có một lớp cơ sở của tòa nhà như vậy

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

Sau đó tôi có nhiều lớp con cho các loại tòa nhà, ví dụ:

public class TownHall:BuildingsBase 
{ 
    public int foodHeld; 

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

Câu hỏi của tôi là cách tốt nhất để đặt giá trị mặc định để tạo lớp con. Ví dụ, woodRequired cho một townhall được đặt thành 500 nhưng ở những nơi khác nhau trong mã tôi cần phải truy cập vào giá trị này trước khi tôi có một thể hiện của townhall tuyên bố (Khi kiểm tra nếu có đủ gỗ để xây dựng).

Tôi hiện đang có một chuỗi toàn cầu các biến mặc định cho từng loại tòa nhà nhưng tôi tự hỏi liệu có cách nào tốt hơn để thực hiện việc này hay không.

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

Tại sao lưu ý lại? Tôi nghĩ đó là một câu hỏi hợp lệ. – Caramiriel

+1

Tại sao không làm theo cách khác? Xây dựng đầu tiên, ví dụ: TownHall nội bộ và sau đó kiểm tra giá trị của 'woodRequired <= myCurrentWood' nếu không đủ gỗ có sẵn chỉ cần phá hủy đối tượng một lần nữa. Vâng, điều đó không nên được thực hiện nếu bạn có đối tượng khổng lồ với rất nhiều tính toán tất nhiên. Người dùng không biết rằng bạn đã giữ đối tượng và chỉ cần gọi .Show() hoặc một cái gì đó. –

+0

Ý tưởng thứ hai là để thực hiện một 'int currentWood()' chức năng và chỉ cần kiểm tra nó trong constructor của các đối tượng, có bạn có thể ngừng tạo ra nếu không đủ gỗ có sẵn –

Trả lời

4

Thông thường điều gì xảy ra là chúng tạo ra trọng số (see pattern). Đối tượng này chứa các thuộc tính giống nhau cho mọi thể hiện. Không cần phải thay đổi (hoặc thực sự lưu trữ) số lượng gỗ yêu cầu cho từng cá thể riêng biệt.

Trong một thiết kế rất cơ bản nó sẽ trông giống như:

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

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

Cuối cùng bạn sẽ được gọi một phương thức như:

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

Tất nhiên, bạn có thể sử dụng một từ điển cho mẫu truy xuất và người chơi không thực sự biết về yêu cầu xây dựng. Tôi chỉ minh họa mô hình ở đây.

Nếu trình phát có đủ tài nguyên, bạn có thể sử dụng mẫu để trừ số tiền và tạo một phiên bản thực tế của TownHall. Thật tuyệt khi có một tham chiếu đến mẫu thực tế, bởi vì bạn có thể đang truy cập các thuộc tính toàn cục khác có giá trị cho tất cả TownHall s (chẳng hạn như âm thanh/hình ảnh/...).

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

Cảm ơn điều đó, rất hữu ích, nó có vẻ giống như một phương pháp tương tự như một mảng toàn cầu nhưng với chi phí thấp hơn. – user3208483

Các vấn đề liên quan