簡體   English   中英

C#覆蓋基類的接口協定方法

[英]C# overriding an interface contract method of a base class

我創建了一個使用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中的方法指定虛擬。 有沒有更簡單的方法可以做到這一點?

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

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(...);
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM