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

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

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

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

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


person user310291    schedule 20.09.2010    source источник


Ответы (6)


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

interface IHasProperty
{
    string Property{ get;set; }
}
class HasProperty:IHasProperty 
{
    public string Property{ get;set; }
}
person Andrea Parodi    schedule 20.09.2010
comment
+1 Вы, кажется, единственный, кто ответил на вопрос ОП. - person Chris Shouts; 20.09.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
}

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

person Merlyn Morgan-Graham    schedule 20.09.2010
comment
Большое спасибо. Я бы дал вам хороший ответ, но могу выбрать только один, поэтому выбрал первый, который я видел. - person user310291; 20.09.2010
comment
@ user310291: Мне достаточно того, что вы нашли применение моему ответу :) - person Merlyn Morgan-Graham; 22.09.2010

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

interface IName
{
    string Name { get; }
}
person Nathan Ernst    schedule 20.09.2010
comment
Я думаю, что user310291 спрашивает, можно ли поместить сеттер в интерфейс, а не можно ли его опустить. - person Andrea Parodi; 20.09.2010
comment
Андреа права: если я должен опустить set в интерфейсном классе, означает ли это, что я не могу заставить класс иметь сеттер, что противоречит цели наличия класса интерфейса в этом случае, поскольку я могу только частично применить? - person user310291; 20.09.2010
comment
@ user310291: посмотрите код в моем ответе: абсолютно возможно поместить геттер в интерфейс. - person Andrea Parodi; 20.09.2010

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

person Aliostad    schedule 20.09.2010

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

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

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

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

person Gage    schedule 20.09.2010

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

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

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

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

person Tor    schedule 20.09.2010