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

Для чего нужен пустой интерфейс

Я смотрю на nServiceBus и пришел через этот интерфейс

namespace NServiceBus
{
    public interface IMessage
    {
    }
}

Что такое пустой интерфейс?

4b9b3361

Ответ 1

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

Это то, что раньше использовалось в Java, прежде чем у них были аннотации. В .Net это чище использовать атрибуты для этого.


@Stimpy77 Спасибо! Я так и не подумал об этом. Надеюсь, вы позволите мне перефразировать ваш комментарий более общим способом.

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

Ответ 3

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

Ответ 4

В Java пустые интерфейсы обычно использовались для классов "tagging" - в настоящее время обычно используются аннотации.

Это просто способ добавить немного метаданных в класс, говорящий: "Этот класс подходит для использования <this>", даже если не задействованы общие члены.

Ответ 5

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

Ответ 6

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

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

interface one {}
interface two {}

interface three extends one, two {}

Интерфейс три наследует поведение "один" и "два", и поэтому

class four implements three { ... }

должен указать два метода, имеющих тип "три".

Как видно из приведенного выше примера, пустой интерфейс можно увидеть также как точку множественного наследования (не разрешенную на Java).

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

Ответ 7

Работала с NServiceBus за последний год. Хотя я не стал говорить за Udi Dahan, я понимаю, что этот интерфейс действительно используется в качестве маркера в первую очередь.

Хотя я бы посоветовал вам самому спросить самого человека, есть ли у него мысли оставить это для дальнейшего продления. Моя ставка - нет, поскольку мантра, похоже, должна содержать сообщения очень просто или, по крайней мере, практически агностически.

Другие хорошо отвечают на более общие причины для пустых интерфейсов.

Ответ 8

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

И попросите их отправить функцию для работы над ними, но если интерфейс пуст, я бы сказал, что это просто "pre" -work.

Ответ 9

Они называются "Mark Interfaces" и предназначены для сигнализации экземпляров отмеченных классов.

Например,... на С++ распространена практика отмечать как объекты "ICollectible", поэтому их можно хранить в общих не типизированных коллекциях.

Так как кто-то говорит, они должны сигнализировать поведение, поддерживаемое объектом, например способность собираться, сериализоваться и т.д.

Ответ 10

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

Например, в java интерфейс Cloneable в Java - это пустой интерфейс. Когда класс реализует интерфейс Cloneable, вы знаете, что вы можете вызвать запуск clone() на нем.

Ответ 11

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

Например Применение маркерных интерфейсов с языка программирования Java является интерфейсом Serializable. Класс реализует этот интерфейс, чтобы указать, что его непереходные элементы данных могут быть записаны в ObjectOutputStream. Частный метод ObjectOutputStream writeObject() содержит ряд экземпляров тестов для определения возможности записи, один из которых ищет интерфейс Serializable. Если какой-либо из этих тестов выходит из строя, метод генерирует исключение NotSerializableException.