Для чего используется пустой интерфейс - PullRequest
36 голосов
/ 19 декабря 2008

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

namespace NServiceBus
{
    public interface IMessage
    {
    }
}

Какая польза от пустого интерфейса?

Ответы [ 11 ]

35 голосов
/ 19 декабря 2008

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

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


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

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

18 голосов
/ 19 декабря 2008

Также известен как интерфейс маркера:

http://en.wikipedia.org/wiki/Marker_interface_pattern

10 голосов
/ 19 декабря 2008

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

7 голосов
/ 19 декабря 2008

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

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

2 голосов
/ 09 июля 2013

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

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

interface one {}
interface two {}

interface three extends one, two {}

Интерфейс три будет наследовать поведение «один» и «два», и так

class four implements three { ... }

должен указать два метода типа «три».

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

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

2 голосов
/ 19 декабря 2008

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

1 голос
/ 19 декабря 2008

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

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

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

0 голосов
/ 26 мая 2014

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

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

0 голосов
/ 19 декабря 2008

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

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

0 голосов
/ 19 декабря 2008

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

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

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

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