我们说我有一个"建筑成本"计算类,它采用子计算器列表。
子计算器都定义了一个接口,用于定义该子计算器所需的输入。例如。 IWallsCostInputs
,IRoofCostInputs
。这使得子计算器能够清楚地表达他们需要的数据。
有一个业务对象包含所有子计算器的数据以及更多(如DateLastModified等)。例如。 BuildingCostInputs
。
我希望BuildingCostCalculator
采用一个定义所需输入的界面
public interface IBuildingCostInputs : IWallsCostInputs, IRoofCostInputs
但是,如果IWallsCostInputs
和IRoofCostInputs
中存在任何重复的属性,则此功能无效。
我认为我的选择如下:
IBuildingCostInputs
IWallsCostInputs
和IRoofCostInputs
的抽象类,从BuildingCostInputs
派生并将其传递给BuildingCostCalculator
。IWallsCostInputs
之间实现IRoofCostInputs
和BuildingCostInputs
,(自动)映射,并将其传递给BuildingCostCalculator
。(1)我认为当我通过IWallsCostInputs
和IRoofCostInputs
引用重复属性时以及使用Test Doubles(例如Moq)时会遇到麻烦。
(2)在特定情况下不起作用,因为我的业务对象已经是继承链的一部分。
(3)确实有效,似乎我需要做的事情。但是,我宁愿避免映射和POCO的框架开销。
有没有人有任何意见,或者有更好的方法来实施我想要做的事情?感觉我应该能够以清晰,简洁和富有表现力的方式实现这一目标,但也许这是不可能的。
由于
答案 0 :(得分:1)
我会重新考虑是否需要使用继承。如果你有一个共同的界面,你可以这样做:
public interface IBuildingCostInput
{
IReadOnlyCollection<ICostInputs> CostInputs {get;}
}
或者如果你想明确,或许:
public interface IBuildingCostInput
{
IWallsCostInputs WallCostInputs {get;}
IRoofCostInputs RoofCostInputs {get;}
}
答案 1 :(得分:1)
如果您需要将属性设置为相同,则可以从同一接口继承接口。
--foo