[英]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對象已更新,則所有SerializedItems都應反映該更改。
我不確定在允許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類表示該產品線中的實際項目
比一個合適的設計是使Item
為ItemType
並使用合成代替繼承 。 因此,您的第二種方法(帶有SerializedItem不繼承自Item
的更改)看起來是有效的。
如果Item確實是未實例化的基類,則將其標記為抽象,並遍歷您的具體SerializedItem類(以及您可能擁有的任何其他派生類)。 如果您只想在內存中使用給定的項目編號的單個項目,則可以考慮在項目編號上建立索引的Dictionary類型集合。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.