在继承的对象中实现平等和唯一

时间:2014-07-16 14:01:44

标签: c# .net inheritance design-patterns

我对我的对象模型的结构有一般性的疑问。也许我正从错误的方向接近隧道视野。我有两个类,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对象,则所有Seri​​alizedItem都应该反映该更改。

2 个答案:

答案 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类(以及您可能拥有的任何其他派生类)进行操作。如果您只想在内存中使用给定项目编号的单个项目,那么您可以考虑在项目编号上编入索引的字典类型集合。