我有一个如下定义的抽象类:
public abstract class BaseClientService<T>
where T : ISubsetInfo
{
abstract T Extract(Superset superset);
}
这适用于我的所有实现,但现在我面临一个需要额外参数才能正确执行的实现。
例如
T Extract(Superset superset, int id)
我正在努力寻找最优雅的解决方案,所以我试图避免将第二个参数包括为可空或可选,但我不确定它是否值得付出努力......
我还想将参数包装在一个对象中,并让该对象包含该edgecase的id,但我认为它使得它更复杂,我试图让它变得更简单。
对我来说,一个重要的约束是我总是有一个方法可以在抽象类中调用。
答案 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的提议,但我更喜欢这个,因为我的要求是强类型的。有人可能会在这里过度使用泛型,但现在它已经在我的项目中,它的工作就像一个魅力。