簡體   English   中英

強制繼承對象之間的平等和唯一性

[英]Enforcing Equality and Uniqueness Among Inherited Objects

我對我的對象模型的結構有一個普遍的疑問。 也許我是從錯誤的方向來解決這個問題的。 我有兩個類,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類是特定產品“小部件A”的表示。 它具有有關小部件A的成本,重量,尺寸等的信息。無論生產多少個小部件,它們都共享此信息。

SerializedItem類是該產品系列“ Widget A 001”中實際項目的表示。 它包含有關該項目的實際位置及其生產和銷售歷史的信息。

如果Item對象已更新,則所有Seri​​alizedItems都應反映該更改。

我不確定在允許SerializedItem充當其基本類型的同時用於實施該約束的最佳模式

乍一看, 輕量級工廠模式似乎是合適的。 創建一個類,其職責是創建Item ,跟蹤已創建的Item ,並確保僅創建具有給定鍵的一個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類表示該產品線中的實際項目

比一個合適的設計是使ItemItemType並使用合成代替繼承 因此,您的第二種方法(帶有SerializedItem不繼承自Item的更改)看起來是有效的。

如果Item確實是未實例化的基類,則將其標記為抽象,並遍歷您的具體SerializedItem類(以及您可能擁有的任何其他派生類)。 如果您只想在內存中使用給定的項目編號的單個項目,則可以考慮在項目編號上建立索引的Dictionary類型集合。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM