假设我从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的实现不符合您的接口协定,因为这样的事实,即也实现MyOtherModelILibModel类型是根据接口协定传递的有效类型。

解决此问题的唯一方法是可能在接口上使用泛型。一个例子是:

public interface IMyManager<TModel>
    where T : ILibModel
{
    void SetModel(TModel model);
}

public class MyManager : IMyManager<MyModel>
{
    void SetModel(MyModel model)
    {

    }
}


但是,您可能会遇到此类系统的协方差和逆方差问题。

10-08 05:14