图案

2014-11-21 75 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... 
} 

麻生太郎。