gpt4 book ai didi

c# - 通过子类型参数 : is it possible? 从类接口(interface)继承方法

转载 作者:太空宇宙 更新时间:2023-11-03 22:13:47 24 4
gpt4 key购买 nike

假设我从 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 类型。

该接口(interface)明确声明它必须采用 ILibModel 类型。因此,仅采用 MyModel 的实现不符合您的接口(interface)约定,因为一个类型,例如 MyOtherModel 也实现了 ILibModel 是根据接口(interface)约定传入的有效类型。

解决此问题的唯一方法是潜在地在接口(interface)上使用泛型。一个例子是:

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

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

}
}

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

关于c# - 通过子类型参数 : is it possible? 从类接口(interface)继承方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5733671/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com