我正在寻找一个类结构或设计模式来实现一个具有“基本项”列表的基类,其中几个派生类具有相同的列表,但该列表是派生的“基本项”。
这是一个非常简单的示例(忽略属性的可访问性,它们实际上不会都有公共setter和默认构造函数):
public class BaseTransaction {
public List<BaseTransactionItem> Items { get; set; }
public void AddItem(string description, int quantity, decimal price)
{
// Add a new BaseTransactionItem to Items
}
}
public class BaseTransactionItem {
public string Description { get; set; }
public int Quantity { get; set; }
public decimal Price { get; set; }
}
public class OrderTransaction : BaseTransaction {
public List<OrderTransactionItem> Items { get; set; }
public int Deposit { get; set; }
public void SetDeposit(int depositAmount)
{
// Do some stuff to set the deposit.
}
}
public class OrderTransactionItem : BaseTransactionItem
{
public int QuantityFulfilled { get; set; }
}
public class RetailTransaction : BaseTransaction {
public List<RetailTransactionItem> Items { get; set; }
public List<Tender> Tenders { get; set; }
public void AddTender(Tender tender)
{
// Add a tender to the RetailTransaction
}
public decimal TotalTax
{
get { return Items.Sum(i => i.Tax); }
}
}
public class RetailTransactionItem : BaseTransactionItem
{
public decimal Tax { get; set; }
}
我需要使用这些类的方法是,您从BaseTransaction
开始并向其添加一些项目,然后它可以成为OrderTransaction
或RetailTransaction
。这些都与BaseTransaction
共享大多数逻辑和属性,但具有特定的额外字段和方法,以及List<BaseTransactionItem>
分别成为List<OrderTransactionItem>
或List<RetailTransactionItem>
。< / p>
此外,将BaseTransaction
“提升”为RetailTransaction
后,可以将其“降级”为BaseTransaction
,然后“提升”为OrderTransaction
(但在这种情况下从不从RetailTransaction
到OrderTransaction
)。
我已经尝试了几种方法,使用泛型,装饰器模式(看起来不合适),TypeConverters,但似乎没有任何东西适合。我认为唯一可行的解决方案是让RetailTransaction
类有一个构造函数,它接受BaseTransaction
并复制所有属性并使用.Cast<RetailTransactionItem>
转换列表但这将是使得维护派生类非常困难。
如果不是需要更改的列表类型,这将是使用继承的简单情况。我完全愿意采用其他方法,例如那些偏向于继承的组合,但由于RetailTransaction
和OrderTransaction
类确实是BaseTransaction
的更具体版本,所以继承似乎很合适 - 至少在我的想法。