C# - Что является причиной "Явно реализованные члены интерфейса всегда неявно являются частными?"

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

например:

 // when explicit implementation it is always private
  void IPointy.Draw( )

  {

  }

почему такое правило проектирования применяется?

Замечания:

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

class Line :IPointy
{

       // Now it is private    
       void IPointy.Draw( )

      {


      }

}

Мой вопрос является причиной реализации как частный.

3 ответа

Явно реализованные члены интерфейса не являются просто частными. Они публичные - вроде.

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

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

Спецификация C# 3.0 объясняет это следующим образом:

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

Потому что 2 интерфейса, которые реализованы этим классом явно, могут иметь метод с одинаковым именем. Вот почему этот метод является закрытым при доступе по ссылке на класс и открытым при интерфейсе.

Поскольку вы говорите, когда мой объект - IPointy, вы можете вызвать метод IPointy draw. В противном случае нет.

 public interface IPointy
{
    void Draw();
}

public class PointyImplementer : IPointy
{
    #region IPointy Members

    void IPointy.Draw()
    {
        Console.WriteLine("You have drawn");
    }

    #endregion
}

class Program
{
    static void Main(string[] args)
    {
        IPointy pi = new PointyImplementer();

        pi.Draw();

        Console.Read();
    }
}

Это способ маскировать интерфейс, который вы реализуете.

Другие вопросы по тегам