2011-12-15 3 views
32

Может ли кто-нибудь, пожалуйста, помочь мне в том, лучше ли включать свойства интерфейса или абстрактного класса?Свойства C# на интерфейсе

Я бы предположил, что интерфейс должен иметь только сигнатуры методов?

+0

Возможный дубликат [Интерфейс vs Абстрактный класс (общий OO)] (http://stackoverflow.com/questions/761194/interface-vs-abstract-class-general-oo) – MPelletier

+2

как это обман? Как заметил Кайл ниже, оба интерфейса и абстрактные классы могут иметь свойства, поэтому нет «против», Вот. – bryanmac

ответ

11

Свойства штраф в интерфейсе

См:

http://msdn.microsoft.com/en-us/library/ms173156.aspx

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

+20

Просто потому, что это возможно, это не значит, что это лучшая практика, как задал ОП. –

12

Совершенно допустимо иметь свойства в интерфейсе. Я делаю это все время.

+0

Возможно, это просто вопрос предпочтения. Хорошо, я собираюсь забыть эти дебаты и сделать то, что вы делаете. – SWIIWII

6

Совершенно корректно включать свойство в интерфейс или абстрактный класс.

25

Свойства - это синтаксический сахар для методов. Рассмотрим это:

У меня есть свойство:

String PropertyA { get; set; } 

Во время выполнения этого становится чем-то вроде этого:

String get_PropertyA() { ... } 
void set_PropertyA(String value) { ... } 

Обратите внимание, что "..." указывает на то, что код будет быть поставлен там генератором кода. Фактически я говорю, что свойства действительно не существуют за пределами C#, поскольку они сводятся к методам, использующим конвецию, указанную в моем примере. Чтобы подтвердить, что я говорю, вы можете использовать отражение и посмотреть, как выглядит отраженный код.

Это может быть плохой практикой, однако, чтобы поместить свойства на интерфейс, если они делают что-то, что нетривиально в реализации. Например, если я хочу установить переменную и обновлять другие переменные, или установка свойства может лишить мое присвоение свойства из-за внутреннего условия, тогда свойство не должно использоваться. Я думаю, что это общее правило, которое будет применяться за пределами интерфейсов.

+2

Выполнение чего-то нетривиального - это плохая практика для периода свойств, как вы указали.Это вызывает проблемы в отладчике, и потребителю класса неясно, что будет выполнена значительная работа. Для интерфейсов вы не можете определить, является ли он нетривиальным, поскольку он не имеет реализации. Все, что вы можете сделать, это подразумевать нетривиальную работу по имени - но по определению. естественно, подразумевает метод. – bryanmac

+1

Использование только свойств геттера имеет смысл для DTO-интерфейсов. – mbx

+0

Как определить нетривиальную? Я боролся с решением сделать несколько членов по свойствам или методам интерфейса. В одной реализации это будет прямой набор/получение поля, но с другой стороны, ему нужно будет выполнить регулярное выражение, чтобы извлечь значение из члена поля. Как мы можем знать, будет ли это нетривиально, если мы еще не знаем различных реализаций интерфейса? –

1

Я не верю, что для этого есть лучшая практика.

Свойства (которые действительно являются методами) разрешены на интерфейсах. Все, что угодно, это просто мнение. Это включает мой пункт о чем-то еще, являющемся мнением.

Смежные вопросы