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();
}
}
Это способ маскировать интерфейс, который вы реализуете.