Интерфейс с геттером и сеттером в c # - PullRequest
15 голосов
/ 20 сентября 2010

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

Возможно иметь get в интерфейсе, НО set?

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

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

Ответы [ 6 ]

34 голосов
/ 20 сентября 2010

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

interface IHasProperty
{
    string Property{ get;set; }
}
class HasProperty:IHasProperty 
{
    public string Property{ get;set; }
}
12 голосов
/ 20 сентября 2010

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

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
}

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

7 голосов
/ 20 сентября 2010

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

7 голосов
/ 20 сентября 2010

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

interface IName
{
    string Name { get; }
}
4 голосов
/ 20 сентября 2010

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

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

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

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

2 голосов
/ 20 сентября 2010

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

Вы МОЖЕТЕ использовать как get, так и set в свойстве интерфейса!

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

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

...