Интерфейсы, как определено MSDN "содержат только подписи методов, делегатов или событий". Однако, поскольку свойства являются не более чем синтаксическим сахаром для метода get и set, они также допускаются в интерфейсах. Мой вопрос: есть ли ситуация, когда определение свойств в интерфейсе является подходящим или следует придерживаться сценариев, описанных MSDN?Должны ли интерфейсы определять свойства?
ответ
Я думаю, что свойства вполне приемлемы в интерфейсах.
Как вы сказали, они действительно являются методом get, set, get и set. Многие интерфейсы в Framework определяют свойства, такие как IAsyncResult и IWebProxy.
В статье связывании также говорится:
Интерфейс может быть членом пространства имен или класса и могут содержать подписи следующих членов:
- Методы
- Недвижимости
- Индексы
- События
@Simon: да, я вижу сейчас. –
Да, интерфейс должен определить свойства, когда он действительно нуждается. Пожалуйста, предположите. Существует интерфейс IUser, который определил свойство «Имя», а затем вы можете использовать его, не беспокоясь о том, что объект не реализовал свойство.
public void main()
{
IUser u = User.GetUser("id");
string name = u.Name;
}
Thank you, Reed. В этом случае, должны ли эти свойства быть элементарными (не определенными пользователем) типами? Причина, о которой я прошу, заключается в том, что если вы, например, определите ее как тип домена, вы можете получить круговую ссылку. –
@ Otávio Décio: Имейте в виду цель интерфейса. Интерфейс определяет контракт. Если для контракта требуется имущество, то это нормально. Вы не должны заканчивать круговыми ссылками, поскольку свойства не должны быть типами, которые непосредственно реализуют интерфейс, а скорее как базовые, типы фреймов, так и сами типы, которые являются частью «контракта». IWebProxy (связанный выше) является хорошим примером - он имеет свойство Credentials, которое имеет значение ICredentials. Это часть контракта, но существенный «пользовательский» тип все еще (для этого lib). –
, чтобы убедиться, что свойства, определенные в интерфейсах, должны быть либо не определенными пользователем конкретными типами, либо типами интерфейсов (определенными пользователем или нет). –