2010-03-21 2 views
21

Интерфейсы, как определено MSDN "содержат только подписи методов, делегатов или событий". Однако, поскольку свойства являются не более чем синтаксическим сахаром для метода get и set, они также допускаются в интерфейсах. Мой вопрос: есть ли ситуация, когда определение свойств в интерфейсе является подходящим или следует придерживаться сценариев, описанных MSDN?Должны ли интерфейсы определять свойства?

ответ

31

Я думаю, что свойства вполне приемлемы в интерфейсах.

Как вы сказали, они действительно являются методом get, set, get и set. Многие интерфейсы в Framework определяют свойства, такие как IAsyncResult и IWebProxy.

+0

Thank you, Reed. В этом случае, должны ли эти свойства быть элементарными (не определенными пользователем) типами? Причина, о которой я прошу, заключается в том, что если вы, например, определите ее как тип домена, вы можете получить круговую ссылку. –

+1

@ Otávio Décio: Имейте в виду цель интерфейса. Интерфейс определяет контракт. Если для контракта требуется имущество, то это нормально. Вы не должны заканчивать круговыми ссылками, поскольку свойства не должны быть типами, которые непосредственно реализуют интерфейс, а скорее как базовые, типы фреймов, так и сами типы, которые являются частью «контракта». IWebProxy (связанный выше) является хорошим примером - он имеет свойство Credentials, которое имеет значение ICredentials. Это часть контракта, но существенный «пользовательский» тип все еще (для этого lib). –

+1

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

13

В статье связывании также говорится:

Интерфейс может быть членом пространства имен или класса и могут содержать подписи следующих членов:

  • Методы
  • Недвижимости
  • Индексы
  • События
+0

@Simon: да, я вижу сейчас. –

3

Да, интерфейс должен определить свойства, когда он действительно нуждается. Пожалуйста, предположите. Существует интерфейс IUser, который определил свойство «Имя», а затем вы можете использовать его, не беспокоясь о том, что объект не реализовал свойство.

public void main() 
{ 
    IUser u = User.GetUser("id"); 
    string name = u.Name; 
}