C # унаследованный защищенный метод, реализующий интерфейс - PullRequest
3 голосов
/ 08 августа 2009

У меня есть определения этого класса / интерфейса в 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 () является статическим, не общедоступным или имеет неправильный тип возвращаемого значения.

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

Ответы [ 3 ]

5 голосов
/ 08 августа 2009

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

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

    int ICollection.Count
    {
        get
        {
            return Count;
        }
    }
}
1 голос
/ 09 августа 2009

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

Есть 2 способа реализации интерфейса. Явная реализация или неявная реализация.

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

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

Определение открытого метода Bar () - это неявная реализация .

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

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

Хитрость заключается в реализации интерфейса, но не в том, чтобы все члены интерфейса были публичными членами в классе.

1 голос
/ 08 августа 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...