Интерфейс с геттером и сеттером в С#
Как я читаю здесь 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