假设我从IMyManager继承了SetModel。如果我实现它,我通常会写:
using lib.model;
namespace MyComponents
{
public class MyManager:IMyManager
{
public void SetModel(ILibModel model)
{
}
}
}
对编译器来说很好。
现在,让我们通过实现ILibModel的具体类MyModel代替ILibModel。
为什么当MyModel的类型为ILibModel时,编译器为什么不接受呢?
namespace MyComponents
{
public class MyManager:IMyManager
{
public void SetModel(MyModel model) {
}
}
}
最佳答案
假定MyModel
实现ILibModel
之所以不起作用,是因为虽然所有MyModel
类型都是ILibModel
类型,但反函数不成立。也就是说,并非所有ILibModel
类型都是MyModel
类型。
接口明确声明必须采用ILibModel
类型。因此仅采用MyModel
的实现不符合您的接口协定,因为这样的事实,即也实现MyOtherModel
的ILibModel
类型是根据接口协定传递的有效类型。
解决此问题的唯一方法是可能在接口上使用泛型。一个例子是:
public interface IMyManager<TModel>
where T : ILibModel
{
void SetModel(TModel model);
}
public class MyManager : IMyManager<MyModel>
{
void SetModel(MyModel model)
{
}
}
但是,您可能会遇到此类系统的协方差和逆方差问题。