抽象类设计的方法,允许使用备用参数实现edgecase方法

时间:2012-01-04 13:46:57

标签: c# .net oop

我有一个如下定义的抽象类:

public abstract class BaseClientService<T>
    where T : ISubsetInfo
{
    abstract T Extract(Superset superset);
}

这适用于我的所有实现,但现在我面临一个需要额外参数才能正确执行的实现。

例如

T Extract(Superset superset, int id)    

我正在努力寻找最优雅的解决方案,所以我试图避免将第二个参数包括为可空或可选,但我不确定它是否值得付出努力......

我还想将参数包装在一个对象中,并让该对象包含该edgecase的id,但我认为它使得它更复杂,我试图让它变得更简单。

对我来说,一个重要的约束是我总是有一个方法可以在抽象类中调用。

2 个答案:

答案 0 :(得分:0)

Extract函数不必具有其他参数,但是它需要调用一些虚拟函数,如果需要,它将提供额外的数据,如Object GetParameter(string parameterName)。如果其Extract函数需要它,派生类必须实现此函数。

答案 1 :(得分:0)

我最终采用的解决方案是在我的设计中引入一个名为Requirement的新通用对象,用于识别操作的其他要求:

public abstract class BaseClientService<T, R>
where T : ISubsetInfo
      R : IRequirement
{
    abstract T Extract(R requirement);
}

这个解决方案很像Dialecticus的提议,但我更喜欢这个,因为我的要求是强类型的。有人可能会在这里过度使用泛型,但现在它已经在我的项目中,它的工作就像一个魅力。