поля не разрешены в интерфейсе С#

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

У кого-нибудь есть объяснение, почему это так?


person Ravisha    schedule 01.02.2010    source источник


Ответы (4)


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

Вместо этого вы можете объявлять свойства в интерфейсах.


ОБНОВЛЕНИЕ (после того, как понял, что вопрос был о константах, а не о переменных полях): я думаю (чисто мое личное предположение), что Java решила разрешить такие конструкция, потому что тогда у нее не было типов enum. В C# с самого начала были перечисления, и большую часть времени они предпочитали их константам. Более того, вы можете создать статический класс на C# и добавить в него все, что вам нравится, и без особых проблем отправить его по интерфейсу. Поддержка такой конструкции только усложнила бы определение интерфейса.

person mmx    schedule 01.02.2010
comment
Вы также не можете объявлять обычные поля в интерфейсах Java, но вы можете объявлять константы. Об этом говорит ОП. - person Jon Skeet; 01.02.2010
comment
И я знаю, что интерфейс не нуждается в объяснении по этому поводу. Я упомянул, что это константа, которую я пытаюсь добавить, - person Ravisha; 01.02.2010
comment
@Джон: Понятно. Я думал, что вопрос более общий. В любом случае это было бы странно, но у меня нет теоретической причины не делать этого (или, может быть, поскольку у меня есть опыт работы с C#, мне это кажется странным). - person mmx; 01.02.2010
comment
@afshari, вы сравниваете яблоки и апельсины. Наличие констант интерфейса вместо перечислений - очень хромое объяснение. - person Ravisha; 01.02.2010
comment
@Ravisha: я не сравниваю их напрямую. Я хочу сказать, что отсутствие этой функции упрощает язык. Тем более, что некоторая их дополнительная ценность уже обеспечена перечислениями, эта функция уже менее захватывающая в C#. - person mmx; 01.02.2010
comment
Уважаемый afshari, вы предвзято относитесь к идее реализации С#. Есть возможность использовать константы в интерфейсе, поэтому они есть в java. Какова основная причина наличия ограничений в С#, это мой вопрос - person Ravisha; 01.02.2010
comment
@Ravisha: я никогда не утверждал, что мое мнение непредвзято, но это не имеет значения. Эта функция не существует в C#, потому что разработчики не думали, что она достаточно полезна по сравнению с затратами. Я просто объяснил мои собственные предположения о том, почему они не думали, что должны включать это (правильно, ИМХО) в этот ответ: вы уже можете сделать то, что вы могли бы сделать с интерфейсом поля с небольшим количеством кода в худшем случае. - person mmx; 01.02.2010
comment
@afshari Этот аргумент ни к чему не приведет. В любом случае, спасибо за предложение помощи. - person Ravisha; 04.02.2010

Мне редко хотелось иметь настоящую константу в интерфейсе — обычно они имеют больше смысла в классах. Практика использования интерфейса Java для того, чтобы только содержать константы (чтобы сократить количество операций ввода в классах, которые их используют), отвратительна; Я бы поместил константы в интерфейсы только там, где они были связаны с функциональностью внутри самого интерфейса.

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

По сути, оба из них были бы способом превратить интерфейс в «мини-пространство имен» само по себе. Однако я не могу сказать, что очень часто пропускал его при написании C#. Как любит говорить команда C#, функции не удаляются — они добавляются, и стоимость добавления функции очень высока. Это означает, что функция действительно должна нести свой вес — прежде чем функция будет добавлена, должна быть значительная польза. Я лично не поставил бы это очень высоко в списке.


Связанная мысль: было бы неплохо иметь возможность определить вложенный класс внутри интерфейса, обычно это реализация интерфейса — либо для выражения его контрактов, либо для действия в качестве реализации «по умолчанию» для ситуаций, когда есть такая штука.

person Jon Skeet    schedule 01.02.2010
comment
Поддерживает ли CLR вложенные типы в интерфейсах? Никогда не пробовал это. - person mmx; 01.02.2010
comment
@Mehrdad: я думаю, что это должно работать для перечислений, чтобы код VB работал. Я очень сомневаюсь, что он ограничен только перечислениями. - person Jon Skeet; 01.02.2010
comment
Только что проверил. Он отлично поддерживает вложенные типы (даже классы) в интерфейсах. Теперь, когда я думаю об этом, нет никаких причин, по которым CLR не должна была его поддерживать. Интерфейсы мало чем отличаются от классов на уровне IL. - person mmx; 01.02.2010
comment
Вам не нужны константы в интерфейсах. Особенности стоят много. Конечно, но дизайнеры не пропустили это, потому что они вам не нужны. Это аргументация решения, но не объяснение. Я не минусую, но и плюс не буду. - person Peteter; 09.01.2012
comment
@Peteter: я не понимаю ваших рассуждений. Что-то, что не особенно полезно, это объяснение решения не включать эту функцию в C#, и я также объяснил, почему это не особенно полезная функция. Какого объяснения вы ожидали, которого здесь нет? - person Jon Skeet; 09.01.2012
comment
@JonSkeet Первый из; Ваш ответ отвечает на вопрос, но половина его также отвечает (я должен предположить) на множество других вопросов, касающихся «почему функция X находится в С# или вне ее?». Во-вторых, та половина, которая специфична для этого вопроса, я считаю довольно субъективной. (Не поймите меня неправильно, мне нравится перенимать опыт других людей по SO, и, возможно, я огорчен, потому что никто не сказал что-то вроде «Техническое задание на дизайн говорит A» или «Это нарушит оптимизацию B» ) - person Peteter; 09.01.2012
comment
@Peterer: Итак, вы жалуетесь, потому что мой ответ дает больше, чем просто ответ на этот конкретный вопрос? Что касается субъективности - да, никто, кто не входит в команду разработчиков C # или не имеет доступа к их заметкам, не может дать ничего, кроме предположений. Какая-то странная критика... - person Jon Skeet; 09.01.2012

и добавление констант в интерфейсы также не рекомендуется в Java (по крайней мере, согласно Effective Java)

person Mario F    schedule 01.02.2010
comment
Нет ничего плохого в наличии констант в интерфейсах. Что-то не так с реализацией интерфейсов для получения простых для ввода констант. Вместо этого это было обработано статическим импортом. - person Thorbjørn Ravn Andersen; 01.02.2010
comment
Я не знал о статическом импорте, спасибо, что упомянули об этом, Андерсон - person Ravisha; 01.02.2010
comment
Статический импорт — это мерзость и просто приводит к путанице, так как без помощи IDE невозможно определить, откуда берется константа и т. д. Жаль, что Java была изменена, чтобы потворствовать прихотям ленивых людей, не так уж сложно квалифицировать доступ каждого члена. - person mP.; 05.02.2010

Добавлять константы в интерфейс неправильно и почти никогда не следует делать. В прошлом многие люди объявляли интерфейсы со многими константами, а затем реализовывали этот интерфейс в другом классе, чтобы они могли использовать константы без уточнения указанной константы. Это, конечно, еще один антипаттерн, и он был сделан только потому, что люди были ленивы. Если вам действительно нужна константа в интерфейсе, определите метод, который возвращает эту константу.

person mP.    schedule 05.02.2010
comment
определите метод, который возвращает константу в интерфейсе!! Я не знал, что мы можем реализовать метод в интерфейсе. Какая-то новая концепция? - person Ravisha; 05.02.2010