我很可能在这里遗漏了一些明显的东西;但如果我有以下内容:
public interface IRequest<out T>
where T : class
{
T Request
{
get;
}
}
和:
public interface IResponse<out T>
where T : class
{
T Response
{
get;
}
}
然后是使用这些接口(interface)作为通用类型参数的第三个接口(interface):
public interface IResponder<in TRequest, TRequestValue, out TResponse, TResponseValue>
where TRequest : IRequest<TRequestValue>
where TResponse : IResponse<TResponseValue>
where TRequestValue : class
where TResponseValue : class
{
TResponse Query(TRequest request);
}
有没有办法避免必须通过 TRequestValue
和 TResponseValue
作为 IResponder
的通用参数(因此避免必须重复关联的约束)?
本质上,我更愿意使用类似于以下内容的东西来将泛型类型参数的数量减少到 IResponder
(我意识到目前无法编译):
public interface IResponder<in TRequest, out TResponse>
where TRequest : IRequest
where TResponse : IResponse
{
TResponse Query(TRequest request);
}
我能想到的唯一方法是编写两个非通用接口(interface)( IRequest
和 IResponse
)然后制作 IRequest<T>
和 IResponse<T>
实现这些,但在某些方面这似乎是错误的。
我完全意识到我可能因为我在这里做事的方式而遇到了这个问题,所以请随时提出我做错了什么!
注意:整个请求、响应、响应程序示例实际上并不是我正在编写的代码,而是一个尝试支持我的问题的示例。
没有。 IRequest 不一定是 IRequestValue。 您 很清楚,但这只是因为抽象语义。编译器无法知道这一点。
还请考虑一下您是否对函数参数采用了相同的方法。假设编译器可以推断流浪汉参数是否合理?不可以。您必须手动传递它们,没有办法绕过它。
我是一名优秀的程序员,十分优秀!