具有空子类的类继承

时间:2014-01-07 23:01:53

标签: oop object inheritance

假设我有一个名为Expense的类建模费用项。我们有运输,食品和工资支出。假设所有属性都是相同的,因此只有一个Expense类,具有“type”属性。但是,假设我添加了一种新类型的费用,称为培训,这需要一些关于培训类型,位置和日期的新字段。此外,还有一些特定于此培训费用的新方法。所以在这一点上,我需要继承Expense类,以便我可以拥有一个TrainingExpense类。由于子类现在定义了费用的类型,这是否使得在Expense基类中具有“type”属性变得多余?我现在应该只为每种不同的类型继承Expense基类吗?或者我应该在基类中保留“type”属性并为任何子类保留冗余?

2 个答案:

答案 0 :(得分:7)

我会在这里使用合成而不是继承。在基类中创建一个类型为interface IExpenseExtension ExpenseExtension 属性。

对于具有额外属性/方法的费用类型,从IExpenseExtension继承并添加所需的额外属性/方法。在TravelExpense案例中,它将有一个TravelExpenseExtension类,它继承了IExpenseExtension,并带有您需要的额外属性/方法。

在基类中基于ExpenseExtension属性实例化相应的ExpenseType类。

使用合成代替继承可以使其更加灵活。

我还建议你创建一个包含所有类型的枚举,并将它用于ExpenseType属性。

请查看以下网址,了解有关合成与继承的信息:

http://lostechies.com/chadmyers/2010/02/13/composition-versus-inheritance/

从链接: 在类继承上支持对象组合有助于保持每个类的封装并专注于一个任务。 您的类和类层次结构将保持较小,并且不太可能成长为无法管理的怪物。

更新: 请参阅以下C#中的代码示例:

public class Expense
{
    public string Food { get; set; }

    public ExpenseType Type { get; set; }

    private IExpenseExtension expenseExtension;

    public IExpenseExtension ExpenseExtension
    {
        get
        {
            if(expenseExtension == null)
            {
                // Logic to instantiate the correct Extension based on Type property.
                // You can use Factory design pattern or something like that for this as well.
            }

            return expenseExtension;
        }
    }
}

public interface IExpenseExtension
{

}

public class TrainingExpenseExtension : IExpenseExtension
{
    public string Location { get; set; }

    public void GetTrainingDetails()
    {

    }
}

答案 1 :(得分:1)

另一种方法可能是定义IExpense接口,然后实现,因此所有“标准”行为都是通过接口和类中的特殊行为来访问的。像blacktie24的组合方法,但倒置。一切都取决于你如何获得额外的东西。