我对我的对象模型的结构有一般性的疑问。也许我正从错误的方向接近隧道视野。我有两个类,Item和SerializedItem。我已将它们定义为:
public class Item
{
public string ItemNumber { get; set; }
public string Description { get; set; }
public double Cost { get; set; }
}
public class SerializedItem : Item
{
public string SerialNumber { get; set; }
public MyObject Location { get; set; }
}
项目是项目的通用定义,包含该产品的通用信息。 SerializedItem是特定物理项的表示。我的困难在于,任何时候内存中只有一个具有特定ItemNumber的Item应该存在,并且我不确定在允许SerializedItem作为其基本类型的同时强制执行该约束的最佳模式。
也许这是一种更合适的方法?我没有很多使用' New'关键字,我过去一直避免使用它,而是支持不需要使用它的继承结构。
public class Item
{
public string ItemNumber { get; set; }
public string Description { get; set; }
public double Cost { get; set; }
}
public class SerializedItem : Item
{
private Items _item;
public SerializedItemz(Item item)
{
_item = item;
}
public new string ItemNumber
{
get { return _item.ItemNumber; }
set { _item.ItemNumber = value; }
}
public new string Description
{
get { return _item.Description; }
set { _item.Description = value; }
}
public new double Cost
{
get { return _item.Cost; }
set { _item.Cost = value; }
}
public string SerialNumber { get; set; }
}
我很感激有关如何处理此问题的任何指导。我并不依赖于任何特定的解决方案。
提供一些清晰度:
Item类是特定产品的表示,' Widget A。'它包含有关小部件A的成本,重量,尺寸等的信息。无论生成多少小部件,它们都共享此信息。
SerializedItem类表示该产品系列中的实际项目,即小组件A 001。'它包含有关该项目的物理位置及其生产和销售历史的信息。
如果更新了Item对象,则所有SerializedItem都应该反映该更改。
答案 0 :(得分:1)
我不确定在允许SerializedItem作为其基本类型时用于强制执行该约束的最佳模式
乍一看, flyweight工厂模式似乎是合适的。创建一个类,其职责是创建Item
,跟踪已创建的项目,并确保只创建一个具有给定键的项目。
您还可以在工厂中构建逻辑以创建不同的子类型,例如SerializedItem
- 您只需要提供适当的SPI来确定所需的类型并收集必要的投入。
基本实现看起来像:
public static class ItemFactory
{
public static Dictionary<string, Item> _Items = new Dictionary<string, Item>;
public static Item GetItem(string itemNumber)
{
if(!_Items.ContainsKey(itemNumber))
{
_Items[itemNumber] = new Item(itemNumber);
// Initialize item if necessary
}
return _Items[itemNumber];
}
}
SerializedItem类表示该产品系列中的实际项目
比合适的设计更让Item
成为ItemType
并使用组合而不是继承。因此,您的第二种方法( SerializedItem 不会从Item
继承的更改)看起来有效。
答案 1 :(得分:0)
如果Item是真正的非实例化基类,则将其标记为抽象,并通过具体的SerializedItem类(以及您可能拥有的任何其他派生类)进行操作。如果您只想在内存中使用给定项目编号的单个项目,那么您可以考虑在项目编号上编入索引的字典类型集合。