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。难道没有更简单的方法来实现这一点吗?
您需要在派生类中重新指定接口:
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(...);
}
}