web-dev-qa-db-ja.com

何のために使用される空のインターフェースとは

私はnServiceBusを見ていて、このインターフェースを介して来ました

namespace NServiceBus
{
    public interface iMessage
    {
    }
}

空のインターフェースの使用は何ですか?

39
terjetyl

通常、それはクラスの使用法を知らせることです。クラスがメッセージであることを通知するiMessageを実装できます。他のコードはリフレクションを使用して、オブジェクトがメッセージとして使用されることを意図しているかどうかを確認し、それに応じて動作することができます。

これは、注釈が付く前にJavaで多く使用されていたものです。Netでは、このために属性を使用する方がきれいです。


@ Stimpy77ありがとう!私はそのようにそれを考えていませんでした。より一般的な方法でコメントを言い換えさせていただければ幸いです。

アノテーションと属性は、実行時にリフレクションを使用してチェックする必要があります。空のインターフェースは、コンパイラーの型システムを使用してコンパイル時にチェックできます。これにより、実行時のオーバーヘッドがまったくなくなり、より高速になります。

38
Mendelt

マーカーインターフェイスとも呼ばれます。

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

21
mattcole

Java Serializableはこれの完璧な例です。メソッドは定義されていませんが、確実に「実装」する必要があるすべてのクラスは、本当にシリアライズ可能であり、参照を保持していません。データベース接続、開いているファイルなど、シリアル化できないものに.

12
André

Javaでは、通常、クラスの「タグ付け」に空のインターフェースが使用されていました。最近では、通常、注釈が使用されていました。

これは、クラスに「このクラスは<this>一般的なメンバーが関与しない場合でも使用できます。

9
Jon Skeet

通常は属性に似ています。空のインターフェースよりも属性の使用が推奨されます(少なくともFxCopが認識している限り)。ただし、.NET自体は、IRequiresSessionStateIReadOnlySessionStateなどのこれらのインターフェイスの一部を使用します。代わりにインターフェースを使用する属性を使用すると、メタデータの検索でパフォーマンスが低下すると思います。

2
Mehrdad Afshari

空のインターフェースは、インターフェースの動作で指定されていないデータ型のプレースホルダーとして機能します。

Javaでは、インターフェース拡張のメカニズムが良い使用例です。たとえば、次のようにするとします

interface one {}
interface two {}

interface three extends one, two {}

インターフェース3は「1」と「2」の動作を継承するため、

class four implements three { ... }

タイプが「3」である2つのメソッドを指定する必要があります。

ご覧のとおり、上記の例から、空のインターフェースは多重継承のポイントと見なすこともできます(Javaでは許可されていません)。

これがさらなる視点で明確になることを願っています。

2
Paolo Maresca

過去1年間NServiceBusで作業してきました。私はdi Dahanについては言いませんが、私の理解は、このインターフェースが実際にmarkerとして実際に使用されていることです。

彼に将来の延長のためにこれを残しておくことを考えていたかどうか、彼自身に尋ねることをお勧めしますが。私の賭けはノーです。マントラはメッセージを非常にシンプルにするか、少なくとも実際にはプラットフォームにとらわれないようにすることです。

他の人は空のインターフェースのより一般的な理由でうまく答えます。

1
dove

「将来の」参照に使用したり、いくつかのオブジェクトを共有したい場合は、このインターフェイスを実装する10個のクラスを使用できると言います。

そして、それらを機能させるために関数に送ってもらえますが、インターフェースが空の場合は、まさに「事前」の作業だと思います。

0
Filip Ekberg

これらは「Mark Interfaces」と呼ばれ、マークされたクラスのインスタンスを通知することを目的としています。

たとえば、C++では、「ICollectible」オブジェクトとしてマークを付けて、型指定されていない一般的なコレクションに格納できるようにするのが一般的です。

だから誰かが言うように、彼らは収集、シリアル化などの機能のような、オブジェクトがサポートする振る舞いを合図することです。

0
Juan Manuel

空のインターフェースは、特定のインターフェースを実装するクラスが特定の動作を持っていることを文書化するために使用されます

たとえば、JavaのCloneableインターフェースは、Javaの空のインターフェースです。クラスがCloneableインターフェースを実装すると、その上でrun clone()を呼び出すことができることを知っています。

0
hhafez

空のインターフェースを使用してクラスをマークします。実行時に、インターフェースを使用して型チェックを実行できます。

たとえば、Javaプログラミング言語からのマーカーインターフェースのアプリケーションはSerializableインターフェースです。クラスはこのインターフェースを実装して、非一時的なデータメンバーをObjectOutputStreamに書き込むことができることを示します。ObjectOutputStreamプライベートメソッドwriteObject()には、書き込み可能性を判別するための一連のinstanceofテストが含まれており、そのうちの1つはSerializableインターフェースを探します。これらのテストのいずれかが失敗した場合、メソッドはNotSerializableExceptionをスローします。

0
hellowahab