2009-08-08 3 views
3

У меня есть эти определения класса/интерфейса в C#C# унаследовал защищенный метод, реализующий интерфейс

public class FooBase { 
    ... 
    protected bool Bar() { ... } 
    ... 
} 

public interface IBar { 
    bool Bar(); 
} 

Теперь я хочу создать класс Foo1, полученный из FooBase реализующий IBar:

public class Foo1 : FooBase, IBar { 
} 

Есть некоторый класс что компилятор использует унаследованный защищенный метод как общедоступную реализацию интерфейса?

Конечно, метод Foo1

bool IBar.Bar() 
{ 
    return base.Bar(); 
} 

работы. Мне просто интересно, есть ли ярлык;)

Опуская этот метод, возникает ошибка компилятора: Foo1 не реализует элемент интерфейса IBar.Bar(). FooBase.Bar() является либо статическим, не общедоступным, либо имеет неправильный тип возврата.

Пояснение: Я разделяю наследование кода (иерархию классов) и реализацию функции (интерфейсы). Таким образом, для классов, реализующих один и тот же интерфейс, доступ к общему (унаследованному) коду очень удобен.

ответ

4

Нет ярлыка. На самом деле, этот шаблон используется в нескольких местах, которые я видел (не обязательно с ICollection, но вы получите идею):

public class Foo : ICollection 
{ 
    protected abstract int Count 
    { 
     get; 
    } 

    int ICollection.Count 
    { 
     get 
     { 
      return Count; 
     } 
    } 
} 
1

Я считаю, что ваш код как можно короче. Не думайте, что там есть какой-то ярлык.

1

Защищенный член FooBase.Bar() не метод реализации интерфейса IBar. Интерфейс требует общественного метода Бар().

Существует два способа реализации интерфейса. Явная реализация или неявное внедрение.

Ниже приводится Явная реализация. Этот метод вызывается, если объект Foo вызывается через переменную IBar.

bool IBar.Bar() 
{ 
    return base.Bar(); 
} 

Определение общественного метода Bar() является неявной реализации.

Чтобы удовлетворить требованиям компилятора, вы можете переопределить или новый метод базового класса как общедоступный (не рекомендуется, если метод защищен в базовом классе).

new public bool Bar() 
{ 
    return base.Bar(); 
} 

Хитрость заключается в реализации интерфейса, но не имеющего всех членов интерфейса в качестве открытых элементов в классе.

Смежные вопросы