Интерфейсы, определенные в MSDN, "содержат только сигнатуры методов, делегатов или событий". Однако, поскольку свойства являются не более чем синтаксическим сахаром для метода get и set, они также разрешены в интерфейсах. Мой вопрос - есть ли ситуации, когда определение свойств в интерфейсе является подходящим, или мы должны придерживаться сценариев, описанных MSDN?
Должны ли интерфейсы определять свойства?
Ответ 1
Я думаю, что свойства вполне приемлемы в интерфейсах.
Как вы сказали, они действительно являются методом get, set или get и set. Многие интерфейсы в Framework определяют свойства, такие как IAsyncResult и IWebProxy.
Ответ 2
В статье, на которой вы ссылаетесь, также говорится:
Интерфейс может быть членом пространства имен или класса и может содержать подписи следующих членов:
- Методы
- Свойства
- Индексаторы
- События
Ответ 3
Да, интерфейс должен определять свойства, когда он действительно нужен. Пожалуйста, предположите. Существует интерфейс IUser, который определил свойство "Имя", а затем вы можете использовать его, не беспокоясь о том, что объект не реализовал свойство.
public void main()
{
IUser u = User.GetUser("id");
string name = u.Name;
}
Ответ 4
Полностью законно определять свойства в интерфейсах. Достаточно хорошее и подробное объяснение того, почему вы можете использовать свойства, но не можете использовать поля, дано в ответе здесь: Почему интерфейсы C Sharp могут содержать поля
Вы должны иметь в виду, что любые свойства, определенные в интерфейсе, всегда будут публичными. То есть, если вы определяете геттер и сеттер в интерфейсе, то и геттер, и сеттер должны быть открытыми. При желании вы можете определить только геттер в интерфейсе, а затем определить частный сеттер в реализующем классе. Это определенно область, в которой нужно тщательно работать.
Точно так же Java не допускает переменных экземпляра в своих интерфейсах. Тем не менее, он позволяет объявлять переменные, и они будут рассматриваться как статические и только для чтения. В Java принято писать методы getMyVariable() и setMyVariable(), если они требуются в реализующем классе. С# по сути просто позволяет более чистый синтаксис.