使用接口在C#中继承相同属性的方法

时间:2015-09-04 10:34:12

标签: c# inheritance interface

我们说我有一个"建筑成本"计算类,它采用子计算器列表。

子计算器都定义了一个接口,用于定义该子计算器所需的输入。例如。 IWallsCostInputsIRoofCostInputs。这使得子计算器能够清楚地表达他们需要的数据。

有一个业务对象包含所有子计算器的数据以及更多(如DateLastModified等)。例如。 BuildingCostInputs

我希望BuildingCostCalculator采用一个定义所需输入的界面

public interface IBuildingCostInputs : IWallsCostInputs, IRoofCostInputs

但是,如果IWallsCostInputsIRoofCostInputs中存在任何重复的属性,则此功能无效。

我认为我的选择如下:

  1. IBuildingCostInputs
  2. 中使用新关键字
  3. 定义一个实现IWallsCostInputsIRoofCostInputs的抽象类,从BuildingCostInputs派生并将其传递给BuildingCostCalculator
  4. 创建一个POCO,在其与IWallsCostInputs之间实现IRoofCostInputsBuildingCostInputs,(自动)映射,并将其传递给BuildingCostCalculator
  5. (1)我认为当我通过IWallsCostInputsIRoofCostInputs引用重复属性时以及使用Test Doubles(例如Moq)时会遇到麻烦。

    (2)在特定情况下不起作用,因为我的业务对象已经是继承链的一部分。

    (3)确实有效,似乎我需要做的事情。但是,我宁愿避免映射和POCO的框架开销。

    有没有人有任何意见,或者有更好的方法来实施我想要做的事情?感觉我应该能够以清晰,简洁和富有表现力的方式实现这一目标,但也许这是不可能的。

    由于

2 个答案:

答案 0 :(得分:1)

我会重新考虑是否需要使用继承。如果你有一个共同的界面,你可以这样做:

public interface IBuildingCostInput
{
     IReadOnlyCollection<ICostInputs> CostInputs {get;}
}

或者如果你想明确,或许:

public interface IBuildingCostInput
{
     IWallsCostInputs WallCostInputs {get;}
     IRoofCostInputs RoofCostInputs {get;}
}

答案 1 :(得分:1)

如果您需要将属性设置为相同,则可以从同一接口继承接口。

--foo