Допустимо ли для интерфейсов объявлять свойства вместо методов? - PullRequest
3 голосов
/ 30 мая 2009

Допустимо ли для интерфейсов объявлять свойства вместо методов?
Что является более предпочтительным?
interface ITaggable {string GetTag (); }
или
интерфейс ITaggable {Tag {get;}}

Жизнь в мире .Net.

Ответы [ 6 ]

7 голосов
/ 31 мая 2009

Абсолютно. Используйте свойство в интерфейсе точно так же, как в классе.

Примеры в структуре включают IEnumerator<T>.Current и ICollection<T>.Count.

2 голосов
/ 30 мая 2009

Свойства определенно предпочтительнее в этом случае.

2 голосов
/ 30 мая 2009

Вполне нормально использовать свойства для такого сценария. Я предпочитаю использовать свойство, а не метод GetFoo (), когда вы на самом деле просто получаете значение.

1 голос
/ 31 мая 2009

Обычное различие (по крайней мере, то, которое я использую, я действительно надеюсь, что оно "обычное" :)) между свойствами и методами все еще применяется.

Если акт получения данных от объекта через именованный идентификатор (свойство или метод) является либо:

  • Дорогая операция (т. Е. Она может запрашивать базу данных)
  • или операция, которая имеет побочные эффекты (т. Е. Она может изменить внутреннее поле)

... тогда это должен быть метод.

Если операция легкая, без побочных эффектов, это может быть свойство.

Таким образом, чтение имени человека является свойством, поскольку это значение, вероятно, должно начинаться с объекта.

Однако, чтобы выяснить, сколько заказов он имеет в системе, это, вероятно, должен быть метод, поскольку, скорее всего, ему придется выполнять более дорогую операцию.

По крайней мере, это критерии, которые я использую.

И не важно, является ли это классом или интерфейсом.

В вашем конкретном случае я бы пошел с собственностью. «Тегируемый» элемент должен знать свои теги.

0 голосов
/ 31 мая 2009

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

Что касается реального выбора, то это вопрос конкретной ситуации, вашего стиля кодирования и подхода к дизайну, которому вы следуете.

0 голосов
/ 31 мая 2009

Там, где предполагаемые языки реализации поддерживают свойства, совершенно правильно использовать их и в вашем интерфейсе (ах) (конечно, вам придется придерживаться методов доступа getter / setter, если вашей целевой целью был язык, который не хватает поддержки свойств).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...