2010-07-22 2 views
21

Можно создать дубликат:
What is the purpose of a marker interface?Интерфейс без участников - плохая практика?

Это плохая практика, чтобы создать совершенно пустой интерфейс, такой как:

public interface ISomething 
{ 
} 

Существует случай, когда я хотел бы относиться некоторые объекты по-другому, чем другие, но я не требую никакого нового поведения.

+0

Я отмечаю как дубликат http://stackoverflow.com/questions/1023068/what-is-the-purpose-of-of- a-marker-интерфейс, потому что он эффективно отвечает на этот вопрос. – spender

+0

никогда не слышал о терминах «интерфейс маркера». Поэтому я не обнаружил, что при поиске. – Erix

+0

@SP - Я бы принял предложение Скотта к сердцу в этом связанном ответе, имо, это корень какого-то мерзкого зла. – Marc

ответ

22

Я лично считаю, что пустые интерфейсы не очень хороши.

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

design guidelines for interfaces конкретно говорит:

Избегайте использования маркеров интерфейсов (интерфейсы без каких-либо элементов).

Пользовательские атрибуты обеспечивают способ маркировки типа. Дополнительные сведения о настраиваемых атрибутах см. В разделе «Написание пользовательских атрибутов». Пользовательские атрибуты предпочтительнее, если вы можете отложить проверку атрибута до тех пор, пока код не будет выполнен. Если ваш сценарий требует проверки времени компиляции, вы не можете выполнить это руководство.

+0

+1 - Я собирался связать эту же статью. –

+0

Проверка времени компиляции включает группирование наследников внутри коллекций. Поэтому я считаю, что я могу нарушить руководство по использованию интерфейса маркера. Отличный ответ и отличная рекомендация! –

12

Рассматривали ли вы использование атрибута вместо интерфейса? Обычно это мой подход. По общему признанию, немного сложнее проверить наличие атрибута, чем объект реализует интерфейс, но он чувствует себя лучше в общем.

+0

Отличное предложение. –

+4

Но атрибуты не позволяют использовать методы расширения. –

0

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

Думаю, вы могли бы считать его абстрактным базовым классом?

1

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

В приложении asp.net mvc, с которым я работал недавно, у меня была основная операция (код отслеживания), которую я хотел сделать на почти каждый запрос (но не на say и ajax-запрос или на страницу администратора). Я добавил операцию на базовый контроллер и выполнил ее в методе ExecuteCore. Для нескольких ситуаций, которые я не хотел запускать, я установил флаг в производном контроллере, чтобы он не запускал его.

Это не так чисто и элегантно, как атрибут, но его намного проще реализовать.

Конечно, это не поможет, если вы хотите создать общие операции для всех производных классов.Но в таком случае должны быть некоторые общие вещи об объектах (скажем, общее свойство), что означало бы, что интерфейс не будет пустым.

1

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

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

Сказано, что если я сравню первый раз, когда я столкнулся с пустым интерфейсом (я помню, что это была определенно Java около 2000) с первого раза, когда я наткнулся на атрибут (веб-службы C#) - мне удалось сделать вывод Цель одного, но другого принудила меня в режим обучения ...

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