C # переопределение метода контракта интерфейса базового класса - PullRequest
0 голосов
/ 03 августа 2011

Я создал класс конвертера, который использует интерфейс IValueConverter и InConverter.Он привязан к DataGrid, и ему передается массив строк, в котором он определяет, находится ли значение в массиве.

[ValueConversion(typeof(int), typeof(bool))]
public class InConverter : IValueConverter
{
    public object Convert(object value, Type type, object parameter, CultureInfo info)
    {
        String str = value as String;
        String[] compareList = parameter as String[];
        if (str != null)
        {
            foreach (String compare in compareList)
            {
                if (str == compare)
                    return true;
            }
        }
        return false;
    }

    public object ConvertBack(object value, Type type, object parameter, CultureInfo info)
    {
        throw new NotImplementedException();
    }
}

У меня также есть класс конвектора NotItConverter, который по существу возвращает противоположность InConverterи я не хотел иметь избыточный код.Итак, я представлял себе это.

[ValueConversion(typeof(int), typeof(bool))]
public class NotInConverter : InConverter
{
    public object Convert(object value, Type type, object parameter, CultureInfo info)
    {
        return !(Boolean)base.Convert(value, type, parameter, info);
    }

    public object ConvertBack(object value, Type type, object parameter, CultureInfo info)
    {
        throw new NotImplementedException();
    }
}

Это не работает, хотя.Единственный способ заставить его компилироваться без предупреждения - заставить методы в NotInConverter указывать переопределение, а методы в InConverter - виртуальные.Нет ли более легкого способа сделать это?

Ответы [ 2 ]

3 голосов
/ 03 августа 2011

Необходимо заново указать интерфейс в производном классе:

public class NotInConverter : InConverter, IValueConverter

Это заставит компилятор создавать отдельные сопоставления интерфейса для производного класса

Доказательство:

static void Main()
{
    ITest x = new TestDerived();
    x.Name();
}

interface ITest {
    void Name();
}

class TestBase : ITest {
    public void Name() { Console.WriteLine("Base"); }
}
class TestDerived : TestBase, ITest {
    public void Name() { Console.WriteLine("Derived"); }
}

Это печатает Derived.

1 голос
/ 03 августа 2011

Я думаю, что это комбинация обоих предложений:

public class NotInConverter : InConverter, IValueConverter
{
  new public object Convert(...)
  {
    return !base.Convert(...);
  }

  new public object ConvertBack(...)
  {
    return !base.ConvertBack(...);
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...