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

本文关键字:契约 方法 接口 重写 基类 | 更新日期: 2023-09-27 18:04:20

我已经创建了一个使用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中的方法指定override,而InConverter中的方法指定virtual。难道没有更简单的方法来实现这一点吗?

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

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

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

我认为这是两种建议的结合:

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