C#重写基类的接口契约方法

时间:2011-08-03 19:20:35

标签: c# interface

我创建了一个使用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();
    }
}

但这不起作用。在没有警告的情况下使其成为complile的唯一方法是使NotInConverter中的方法指定override,InConverter中的方法指定virtual。有没有更简单的方法来实现这一目标?

2 个答案:

答案 0 :(得分:3)

您需要在派生类中重新指定接口:

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 :(得分:1)

我认为这是两个建议的组合:

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

  new public object ConvertBack(...)
  {
    return !base.ConvertBack(...);
  }
}