圖案

2014-11-21 77 views
0

我無法映射這些類:圖案

  • 訂單
  • 托盤

它們一起形成的關係作文,詳見this wikipedia article

訂購的實例有幾個托盤對象,其中有幾個對象。

這是我現在有:

class Order 
{ 
    public Order(){} 
    private List<Pallet> _pallets = new List<Pallet>; 
    public Pallet Add_pallet() 
    { 
     Pallet new_pallet = new Pallet(this); 
     this._pallets.Add(new_pallet); 
     return new_pallet; 
    } 
    //...other properties and methods... 
} 

class Pallet 
{ 
    private Order _parent_order; 
    private List<Box> _boxes = new List<Box>; 
    public Pallet(Order parent_order) 
    { 
     _parent_order = parent_order; 
    } 
    public Box Add_Box() 
    { 
     Box new_box = new Box(this); 
     this._boxes.Add(new_box); 
     return new_box; 
    } 
    //...other properties and methods... 
} 

class Box 
{ 
    private Pallet _parent_pallet; 
    public Box(Pallet parent_pallet){} 
    //...other properties and methods... 
} 

所有必須屬於托盤和所有托盤必須屬於訂購
我怎樣才能正確地執行這個可以避免這一點:

static class Program 
{ 
    static void Main() 
    { 
     Order myOrder = new Order(); 
     Pallet myPallet = new Pallet(myOrder); 
     //Now I have a Pallet that belongs to an Order, 
     //but the Order object is not aware of it 
    } 
} 

我應該使用嵌套類,還是有我丟失的東西更有用?

+0

您的Pallet和Box是否真的需要知道它們分別屬於哪個Order和Pallet?這些循環依賴可能會給垃圾收集器帶來麻煩。也許將關係簿記外包給外部實體會更好? – nullop 2014-11-21 11:06:44

+0

這可能是一種簡化事物的方式,但我仍然可以創建實際上不屬於托盤的Box,並且問題仍然存在。 – 2014-11-21 11:12:46

+0

在我看來,在這種情況下,作曲不是正確的做法。一個'Pallet' /'Box'幾乎可以肯定存在,因此我認爲聚合在這裏更適合。 – James 2014-11-21 15:10:26

回答

0

我會做這樣的:

public class Order 
{ 
    private List<Pallet> _pallets = new List<Pallet>; 
    internal void Add_pallet(Pallet pallet) 
    { 
     if (!this._pallets.Contains(pallet)) 
      this._pallets.Add(pallet); 
    } 
    //...other properties and methods... 
} 

public class Pallet 
{ 
    private Order _parent_order; 
    private List<Box> _boxes = new List<Box>; 
    public Pallet(Order parent_order) 
    { 
     if (parent_order = null) 
      throw ArgumentNilException("parent_order must not be null"); 
     _parent_order = parent_order; 
     _parent_order.Add_pallet(this); 
    } 
    //...other properties and methods... 
} 

麻生太郎。