派生类的设计模式也具有派生子属性

时间:2016-03-14 22:16:44

标签: c# design-patterns

我正在寻找一个类结构或设计模式来实现一个具有“基本项”列表的基类,其中几个派生类具有相同的列表,但该列表是派生的“基本项”。

这是一个非常简单的示例(忽略属性的可访问性,它们实际上不会都有公共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开始并向其添加一些项目,然后它可以成为OrderTransactionRetailTransaction。这些都与BaseTransaction共享大多数逻辑和属性,但具有特定的额外字段和方法,以及List<BaseTransactionItem>分别成为List<OrderTransactionItem>List<RetailTransactionItem>。< / p>

此外,将BaseTransaction“提升”为RetailTransaction后,可以将其“降级”为BaseTransaction,然后“提升”为OrderTransaction (但在这种情况下从不从RetailTransactionOrderTransaction)。

我已经尝试了几种方法,使用泛型,装饰器模式(看起来不合适),TypeConverters,但似乎没有任何东西适合。我认为唯一可行的解​​决方案是让RetailTransaction类有一个构造函数,它接受BaseTransaction并复制所有属性并使用.Cast<RetailTransactionItem>转换列表但这将是使得维护派生类非常困难。

如果不是需要更改的列表类型,这将是使用继承的简单情况。我完全愿意采用其他方法,例如那些偏向于继承的组合,但由于RetailTransactionOrderTransaction类确实是BaseTransaction的更具体版本,所以继承似乎很合适 - 至少在我的想法。

0 个答案:

没有答案