Интерфейс с геттером и сеттером в С#

Как я читаю здесь http://msdn.microsoft.com/en-us/library/75e8y5dd%28v=VS.100%29.aspx

Можно get в интерфейсе, НО НЕ set?

ИЛИ если я хочу получить и установить в интерфейсе, должен ли я использовать старый синтаксис getVar setVar только потому, что новый синтаксис не соответствует синтаксису интерфейса?

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

Ответ 1

Нет. Я думаю, вы неправильно поняли. Эта статья посвящена возможному наличию интерфейса с свойством readonly (свойство только с геттером). Но, если вам нужно, вы можете также установить сеттер в интерфейсе:

interface IHasProperty
{
    string Property{ get;set; }
}
class HasProperty:IHasProperty 
{
    public string Property{ get;set; }
}

Ответ 2

Вы можете использовать синтаксис свойств. Используйте эту комбинацию:

interface ISomething
{
    string Test { get; }
}

class Something : ISomething
{
    public string Test { get; private set; }
}

Вы можете, конечно, добавить полные реализации для геттеров в Something.Test, если вы решите. Для краткости я использовал только резервные поля.

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

interface ISomething
{
    string Test { get; }
}

class Something : ISomething
{
    public string Test { get; set; } // Note that set is public
}

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

Ответ 3

Да, просто опустите set; из объявления свойства. Например:

interface IName
{
    string Name { get; }
}

Ответ 4

Ответ на самом деле представляет собой смесь вышеупомянутых ответов: исключение сеттера на интерфейсе и наличие get; private set; в классе.

Ответ 5

Если вы хотите только получить доступ, просто используйте {get;private set;}

http://msdn.microsoft.com/en-us/library/bb384054.aspx

Класс, показанный в предыдущем примере, является изменяемым. Клиентский код может изменять значения в объектах после их создания. В сложных классах, которые содержат значительное поведение (методы), а также данные, часто необходимо иметь общедоступные свойства. Тем не менее, для небольших классов или структур, которые просто инкапсулируют набор значений (данных) и имеют мало или вообще не поведение, рекомендуется сделать объекты неизменными, объявив набор accessor закрытым. Дополнительные сведения см. В разделе Практическое руководство. Внедрение легкого класса с автоматически реализованными свойствами (Руководство по программированию на С#).

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

Ответ 6

Вы неправильно поняли. Согласно статье вы не можете использовать модификаторы доступа на интерфейсе.

Вы можете использовать оба свойства get и set в интерфейсе!

См. в следующем примере MSDN:

http://msdn.microsoft.com/en-us/library/87d83y5b(v=VS.100).aspx