Модификаторы доступа на элементах интерфейса в C#
Я получаю ошибку компиляции из следующего свойства.
Ошибка:
"модификатор" public "недопустим для этого элемента"
public System.Collections.Specialized.StringDictionary IWorkItemControl.Properties
{
get { return properties; }
set { properties = value; }
}
но если я удалить IWorkItemControl
он компилирует нормально.
почему я получаю эту ошибку и в чем разница наличия / отсутствия имени интерфейса в подписи?
2 ответов
явная реализация интерфейса не позволяет указывать модификаторы доступа. При явной реализации элемента интерфейса (путем указания имени интерфейса перед именем элемента) можно получить доступ к этому элементу только с помощью этого интерфейса. В принципе, если вы:
System.Collections.Specialized.StringDictionary IWorkItemControl.Properties
{
get { return properties; }
set { properties = value; }
}
вы не можете сделать:
MyClass x = new MyClass();
var test = x.Properties; // fails to compile
// You should do:
var test = ((IWorkItemControl)x).Properties; // accessible through the interface
существует несколько вариантов использования для EII. Например, вы хотите предоставить Close
способ для вашего класса, чтобы освободить приобретенные ресурсы, но вы все еще хотите реализовать IDisposable
. Вы могли бы сделать:
class Test : IDisposable {
public void Close() {
// Frees up resources
}
void IDisposable.Dispose() {
Close();
}
}
таким образом, потребители класса могут вызывать только Close
напрямую (и они даже не видят Dispose
в списке Intellisense), но вы все равно можете использовать Test
класса, где IDisposable
(например, в using
заявления).
другой вариант использования для EII предоставляет различные реализации идентично именованного члена интерфейса для двух интерфейсы:
interface IOne {
bool Property { get; }
}
interface ITwo {
string Property { get; }
}
class Test : IOne, ITwo {
bool IOne.Property { ... }
string ITwo.Property { ... }
}
как видите, без EII это даже не возможно реализовать оба интерфейса этого примера в одном классе (поскольку свойства отличаются только типом возврата). В других случаях может потребоваться намеренно обеспечить различное поведение для отдельных представлений класса через различные интерфейсы.
все элементы интерфейса должны быть открытыми. Ведь интерфейс is публичное представление объекта.
с свойства является элементом интерфейса IWorkItemControl, он уже является общедоступным, и вы не можете указать его уровень доступа, даже избыточно указать, что он является общедоступным.