Подтвердить что ты не робот

Должны ли интерфейсы определять свойства?

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

4b9b3361

Ответ 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(), если они требуются в реализующем классе. С# по сути просто позволяет более чистый синтаксис.