Как List <T> делает IsReadOnly приватным, когда IsReadOnly является членом интерфейса?
Я создаю специализированный прокси-класс, который реализует IList<T>
и обертывает внутренний экземпляр List<T>
.
List<T>
сам реализует IList<T>
, который объявляет член bool IsReadOnly, но когда я пытаюсь получить доступ к этому члену из своего собственного класса, я не могу, потому что в List<T>
IsReadOnly является частной.
Итак, мой вопрос; если для реализации интерфейса требуется, чтобы все реализованные члены были общедоступными, почему List<T>
может реализовать IsReadOnly как закрытый и, таким образом, лишить меня доступа к нему?
Ответы
Ответ 1
Он явно реализует элемент интерфейса.
http://msdn.microsoft.com/en-us/library/aa288461(VS.71).aspx
Обратите внимание, что это не делает член интерфейса private
. Он по-прежнему доступен публично, но только если вы посмотрите на объект через интерфейс (с кастингом).
Ответ 2
Причина, по которой он может это сделать, заключается в том, что он использует явную реализацию интерфейса.
bool IList<T>.IsReadOnly { get { ... } }
Этот элемент по-прежнему доступен, но к нему можно получить доступ только с помощью типа IList<T>
.
List<T> list = ...;
bool isReadOnly = ((IList<T>)list).IsReadOnly;
При реализации IList<T>
тип не обещал предоставить значение IsReadOnly. Вместо этого он обещал предоставить свойство IsReadOnly, если он рассматривается как IList<T>
. Независимо от того, предоставляет ли он его на фактическом классе, более чистый выбор автора типа.
Ответ 3
В случае, если List<T>
, IsReadOnly
не имеет смысла: он всегда false
. List
поэтому реализует интерфейс ICollection<T>
(и IList
) явно, тем самым делая интерфейс "private" для нормального использования. Если вам все равно нужно получить к нему доступ, вы можете через явное приведение к интерфейсу:
bool result = ((ICollection<string>)yourStringList).IsReadOnly;
// Or equivalently using `IList`.