Почему метод интерфейса C #, реализованный в классе, должен быть публичным? - PullRequest
21 голосов
/ 30 августа 2011

У меня есть класс, который наследует интерфейс. Метод члена интерфейса реализован в моем классе без модификатора доступа (поэтому по умолчанию он является закрытым).

Я получаю сообщение об ошибке "не удается реализовать элемент интерфейса, поскольку он не является общедоступным".

Почему это не разрешено? Не могу ли я переопределить доступность?

Ответы [ 3 ]

33 голосов
/ 30 августа 2011

Вот пример , почему не имеет смысла переопределять видимость:

interface someI
{
    void doYourWork();
}
public class A : someI
{
    public void doYourWork()
    {
        //...
    }
}

public class B : someI
{
    private void doYourWork()
    {
        //...
    }
}
void Main()
{
    List<someI> workers = getWorkers();
    foreach(var worker in workers)
        worker.doYourWork();
}

Что происходит, когда ваш работник типа B? Вы вызываете метод, как если бы он был публичным, но это частный метод. Если вы хотите эту функциональность, то это не частный метод?

Если вы хотите, чтобы он был общедоступным только при обращении через ваш интерфейс, то вы можете определить его так:

public class B : someI
{
    void someI.doYourWork()
    {
        //...
    }
}

И в итоге вы получите:

var b = new B();
b.doYourWork(); // Not accessible
((someI)b).doYourWork(); // Accessible
21 голосов
/ 30 августа 2011

Методы должны быть реализованы public, потому что они должны вызываться через интерфейс, таким образом, откуда интерфейс доступен как тип.

У вас есть несколько вариантов здесь " change "видимость этого метода.Дано:

public interface IFoo 
{
    bool IsFoo();
}

A.Реализуйте метод явно

public class Foo : IFoo
{
    bool IFoo.IsFoo() { return true; }
}

Метод будет доступен только через интерфейс (IFoo в данном случае.)

B,Изменить видимость интерфейса

Определить интерфейс как internal вместо public.Как следствие, однако, Foo также должен быть internal.

5 голосов
/ 30 августа 2011

Требование, чтобы реализация интерфейса была публичной, является просто логическим требованием. Когда вы реализуете интерфейс, вы говорите компилятору «Привет, я реализую каждый метод на этом интерфейсе». Таким образом, закрытие метода делает его более недоступным и логически не реализованным. Интерфейсы служат контрактом для кода, который использует ваш объект, говоря, что вы всегда можете вызвать любой метод, определенный в интерфейсе моего объекта. Если бы метод реализации был закрытым, это больше не было бы правдой.

Если вы хотите скрыть свою реализацию, скажем, от Intellisense, то вы можете просто реализовать метод явно, как упоминает @Bryan.

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