使用类型约束实现通用接口

4

我有一个使用Visual Studio 2008 C# 2.0 CF的项目,其中我正在实现一个通用接口IComparisonIComparison.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

2个回答

2
这个怎么样?
    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;
    }
} 

那可能是我必须要做的事情。唯一不喜欢的是在调用Compare之前,我不需要知道RETURNED_PARAM类型。为此,我必须在构建时知道两种类型。谢谢! - PaulH

0
你的继承层次结构有问题。 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;
    }
}

如果我从IComparison接口中删除类型约束,则会出现error CS0460:覆盖和显式接口实现方法的约束从基本方法继承,因此不能直接指定的错误。此外,我更喜欢使用通用的IComparable<>接口来避免装箱/拆箱。 - PaulH
@PaulH 我刚刚重新测试了我的示例代码,它编译通过了。你的和我的看起来有什么不同吗? - Gabe Moothart
是的,按照发布的代码它可以编译通过,但你提到要从 IComparison.Compare 接口中删除泛型约束。如果我去掉 where RETURNED_PARAM : IComparable,那么它就无法编译通过了。 - PaulH

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接