实现具有类型约束的通用接口
本文关键字:接口 约束 类型 实现 | 更新日期: 2023-09-27 18:00:09
我有一个Visual Studio 2008 C#2.0 CF项目,我正在该项目中实现一个通用接口IComparison
。可以调用IComparison.Compare
方法来进行对指定对象有效的任何类型的比较,所以我不想对其施加类型约束。
public interface IComparison<EXPECTED_PARAM>
{
Result Compare<RETURNED_PARAM>(RETURNED_PARAM returned);
}
然而,执行工作可以更加具体。在这种情况下,我想说的是,给GreaterThan.Compare
的参数可以通过System.IComparable
与构造函数中给的EXPECTED_PARAM
进行比较。
public class GreaterThan<EXPECTED_PARAM> : IComparison<EXPECTED_PARAM>
{
private EXPECTED_PARAM expected_;
public GreaterThan(EXPECTED_PARAM expected)
{
expected_ = expected;
}
public Result Compare<RETURNED_PARAM>(RETURNED_PARAM returned)
where RETURNED_PARAM : IComparable< EXPECTED_PARAM >
{
return ((returned == null && expected_ == null) ||
(returned != null && returned.CompareTo( expected_ ) > 0)) ?
Result.Fail : Result.Pass;
}
}
不幸的是,这给了我一个错误:
error CS0460: Constraints for override and explicit interface implementation methods are inherited from the base method, so they cannot be specified directly
我需要做些什么才能对EXPECTED_PARAM
对象和RETURNED_PARAM
对象进行任意比较?
谢谢,PaulH
这个怎么样?
public interface IComparison<EXPECTED_PARAM, RETURNED_PARAM>
{
Result Compare(RETURNED_PARAM returned);
}
public class GreaterThan<EXPECTED_PARAM, RETURNED_PARAM> : IComparison<EXPECTED_PARAM, RETURNED_PARAM> where RETURNED_PARAM : IComparable<EXPECTED_PARAM>
{
private EXPECTED_PARAM expected_;
public GreaterThan(EXPECTED_PARAM expected)
{ expected_ = expected; }
public Result Compare(RETURNED_PARAM returned)
{
return ((returned == null && expected_ == null) ||
(returned != null && returned.CompareTo( expected_ ) > 0)) ?
Result.Fail : Result.Pass;
}
}
问题出在继承层次结构上。GreaterThan
继承自IComparison<EXPECTED_PARAM>
,这意味着您告诉编译器它实现了Compare<EXPECTED_PARAM>
,但您希望它实现Compare<RETURNED_PARAM>
。您可以放弃界面上的通用约束:
public interface IComparison
{
Result Compare<RETURNED_PARAM>(RETURNED_PARAM returned)
where RETURNED_PARAM : IComparable;
}
public class GreaterThan<EXPECTED_PARAM>: IComparison
{
private EXPECTED_PARAM expected_;
public GreaterThan(EXPECTED_PARAM expected)
{
expected_ = expected;
}
public Result Compare<RETURNED_PARAM>(RETURNED_PARAM returned)
where RETURNED_PARAM : IComparable
{
return ((returned == null && expected_ == null) ||
(returned != null && returned.CompareTo( expected_ ) > 0)) ?
Result.Fail : Result.Pass;
}
}