Есть ли причина, по которой вы не можете определить модификатор доступа для метода или интерфейса? - PullRequest
5 голосов
/ 30 октября 2009

Ответственность за видимость метода возлагается на класс, который реализует интерфейс.

public interface IMyInterface
{
  bool GetMyInfo(string request);
}

В C # установить модификатор доступа public, private или protected до того, как метод GetMyInfo () сгенерирует следующую ошибку: Модификатор 'private' недопустим для этого элемента.

Существует ли причина, по которой вы не можете определить модификатор доступа для метода или интерфейса?

(вопрос уже задан на французском здесь )

Ответы [ 5 ]

14 голосов
/ 30 октября 2009

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

10 голосов
/ 30 октября 2009

Вы можете фактически сделать метод приватным в реализующем классе, если вы сделаете явную реализацию интерфейса:

public interface IMyInterface
{
    bool GetMyInfo(string request);
}

public class MyClass : IMyInterface
{
    public void SomePublicMethod() { }

    bool IMyInterface.GetMyInfo(string request)
    {
        // implementation goes here
    }
}

Этот подход означает, что GetMyInfo не будет частью открытого интерфейса MyClass. Доступ к нему можно получить только путем приведения экземпляра MyClass к IMyInterface:

MyClass instance = new MyClass();

// this does not compile
bool result = instance.GetMyInfo("some request"); 

// this works well on the other hand
bool result = ((IMyInterface)instance).GetMyInfo("some request");

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

4 голосов
/ 30 октября 2009

С точки зрения ОО - инкапсуляция - это все о сокрытии данных. Это означает, что все, что происходит внутри класса, зависит от реализации класса. Это означает, что было бы бесполезным принуждать к исполнению контрактов частных членов.

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

1 голос
/ 31 октября 2009

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

Если вам нужны разные уровни доступа, используйте отдельный интерфейс.

0 голосов
/ 31 октября 2009

Частное определение в интерфейсе будет:

  1. не предоставляет никаких преимуществ пользователю интерфейса (в конце концов, он является приватным)
  2. ограничить реализующий класс необходимостью реализации метода или свойства
  3. мутный концептуальный характер интерфейса с деталями реализации
  4. быть как абстрактный класс с закрытым методом (что не разрешено)
...