我有一个有趣的情况,我想使用一个基类,利用类型参数来实现接口,并通过继承类保持代码简洁。
public interface ICalculator
{
void Process(ICalculationModel calculationModel);
}
public abstract class CalculatorBase<T> :ICalculator where T : ICalculationModel
{
// Compiler moans that Process(ICalculationModel calculationModel) isn't implemented
public abstract void Process(T calculationModel);
}
public class PipeworkInspections : CalculatorBase<GasSafetyModel>
{
public override void Process(GasSafetyModel documentModel){
//snip
}
}
有没有什么我在通用的“where”子句或其他方面遗漏的东西?在我的想法中,这应该可以工作。或者编译器需要与接口定义完全相同的实现吗?
我不能轻易地将类型参数移动到ICalculator中,因为有很多地方使用它而不需要泛型。
那就清楚了。感谢您提供的信息。现在显然的解决方案是让接口带上类型参数。但是,ICalculator在许多地方都被使用,并且只被引用为“ICalculator”,如果我在引用ICalculator的接口中省略类型参数,则会出现编译器错误...是否有一种应该有效的架构方式?
ICalculator c = new PipeworkInspections(); c.Process(new OtherModel())
,这是不安全的。你最好的做法是实现ICalculator.Process
,然后在泛型实现中进行转换。 - Lee