2013-06-21 20 views
0

我有以下類;C#類與類的數組

public class Hotel 
{ 
    public int Id { get; set; } 
    public Room[] room { get; set; } 

    public class Room 
    {  
     public int RoomId { get; set; } 
     public int RoomTypeId { get; set; } 

     public string Name { get; set; }   
    } 
} 

我可以創造良好的

Hotel oHotel = null; 
oHotel = new Hotel(); 
oHotel.Id = 100; 

類類似下面的數據分配的一個實例,但我怎麼創建客房類,我需要補充相關數據,爲酒店子實例上課?

+0

作爲說明:您應該爲每個類創建一個單獨的.cs文件。 – Kobunite

+0

繼續搜索 –

+0

嘗試Hotel.Room room = new Hotel.Room(); – Andrei

回答

3

通過給房間的參考回到酒店的構造函數。但隨後,酒店不知道的房間,所以添加一個方法也太:

public class Hotel 
{ 
    public int Id { get; set; } 
    public List<Room> Rooms { get; set; } 

    public void AddRoom(Room room) 
    { 
     Rooms.Add(room); 
    } 
} 

public class Room 
{  
    public Hotel Hotel { get; private set; } 
    public int RoomId { get; set; } 
    public int RoomTypeId { get; set; } 

    public string Name { get; set; }   

    public Room(Hotel hotel) 
    { 
     this.Hotel = hotel; 
    } 
} 

然後你可以叫:

var hotel = new Hotel(); 

var room = new Room(hotel); 

hotel.AddRoom(room); 
+0

我試過上面的例子,但是當撥打 Rooms.Add(room); 我收到一條錯誤「對象引用未設置爲對象的實例」。 任何想法爲什麼? – Tommassiov

+0

因爲hotel.Rooms爲null。將其初始化爲Hotel構造函數中的空列表。 – CodeCaster

+0

對不起,你能告訴我如何? – Tommassiov

0
public class Hotel 
{ 
    public int Id { get; set; } 
    public Room[] Rooms { get; set; } 

    public void AddRoom(int id, int typeID, string name) 
    { 
     Room room = new Room(id, typeID, name); 
     this.Rooms.Add(room); 
    } 

    public class Room 
    {  
     public int RoomId { get; set; } 
     public int RoomTypeId { get; set; } 

     public string Name { get; set; }   

     public Room(int id, int typeID, string name) 
     { 
      RoomID = id; 
      RoomTypeId = typeID; 
      Name = name; 
     } 
    } 
} 

客戶端代碼:

Hotel oHotel = null; 
oHotel = new Hotel(); 
oHotel.Id = 100; 

oHotel.AddRoom(1, 1, "Name1"); 
0

使用數組和對象初始值設定項語法的組合,您可以在一個語句中完成所有操作,這對於實例化POCO是完全適當的。

var oHotel = new Hotel 
    { 
     Id = 100 
     room = 
      { 
       new Hotel.Room { RoomId = 1, RoomTypeid = 1, Name = "Name" } 
      } 
    }; 

如果想MITH多個房間來初始化你的酒店,

var oHotel = new Hotel 
    { 
     Id = 100 
     room = 
      { 
       new Hotel.Room { RoomId = 1, RoomTypeid = 1, Name = "A" }, 
       new Hotel.Room { RoomId = 2, RoomTypeid = 1, Name = "B" }, 
       new Hotel.Room { RoomId = 3, RoomTypeid = 2, Name = "C" }, 
       new Hotel.Room { RoomId = 4, RoomTypeid = 2, Name = "D" } 
      } 
    }; 

順便說一句,你

public Room[] room { get; set; } 

財產,應probbably被稱爲Rooms


如果不wan't使用波蘇斯,就像你在展示你的問題,我已經重寫你的類這樣的,使得它一成不變,

public class Hotel 
{ 
    private readonly int id; 
    private readonly IList<Room> rooms; 

    public Hotel(int id; IEnumerable<Room> rooms) 
    { 
     this.id = id; 
     this.rooms = rooms.ToList(); 
    } 

    public int Id 
    { 
     get { return this.id; } 
    } 

    public IEnumerable<Room> Rooms 
    { 
     get { return this.rooms; } 
    } 

    public class Room 
    { 
     private readonly int id; 
     private readonly RoomType type; 
     private readonly string name; 

     public Room(int id, RoomType type, string name) 
     { 

     } 

     public int Id 
     { 
      get { return this.id; } 
     } 

     public RoomType Type 
     { 
      get { return this.type; } 
     } 

     public string Name 
     { 
      get { return this.name; } 
     } 
    } 

    public enum RoomType 
    { 
     // Valid Room Types Here, 
     // ... 
    } 
} 

那麼我這樣實例化,

var oHotel = new Hotel(
    100, 
    { 
     new Hotel.Room(1, Hotel.RoomType..., "A"), 
     new Hotel.Room(2, Hotel.RoomType..., "B"), 
     new Hotel.Room(3, Hotel.RoomType..., "C"), 
     new Hotel.Room(4, Hotel.RoomType..., "D") 
    }); 

仍然在一個單一的聲明,但更緊湊。由此產生的對象將是不可改變的,這具有超出問題範圍的許多益處。