реализация универсального интерфейса с ограничениями типов - PullRequest
4 голосов
/ 21 июня 2011

У меня есть проект Visual Studio 2008 C # 2.0 CF, в котором я реализую универсальный интерфейс, IComparison.Метод IComparison.Compare может быть вызван для любого типа сравнения, допустимого для указанных объектов, поэтому я не хочу накладывать на него ограничение типа.

public interface IComparison<EXPECTED_PARAM>
{
    Result Compare<RETURNED_PARAM>(RETURNED_PARAM returned);
}

Реализация,однако, может быть более конкретным.В этом случае я бы хотел сказать, что параметр, заданный для GreaterThan.Compare, можно сравнить с EXPECTED_PARAM, заданным в конструкторе, через System.IComparable.

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 голосов
/ 21 июня 2011

Как насчет этого?

    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;
    }
} 
0 голосов
/ 21 июня 2011

Ваша иерархия наследования является проблемой.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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...