私はnServiceBusを見ていて、このインターフェースを介して来ました
namespace NServiceBus
{
public interface iMessage
{
}
}
空のインターフェースの使用は何ですか?
通常、それはクラスの使用法を知らせることです。クラスがメッセージであることを通知するiMessageを実装できます。他のコードはリフレクションを使用して、オブジェクトがメッセージとして使用されることを意図しているかどうかを確認し、それに応じて動作することができます。
これは、注釈が付く前にJavaで多く使用されていたものです。Netでは、このために属性を使用する方がきれいです。
@ Stimpy77ありがとう!私はそのようにそれを考えていませんでした。より一般的な方法でコメントを言い換えさせていただければ幸いです。
アノテーションと属性は、実行時にリフレクションを使用してチェックする必要があります。空のインターフェースは、コンパイラーの型システムを使用してコンパイル時にチェックできます。これにより、実行時のオーバーヘッドがまったくなくなり、より高速になります。
マーカーインターフェイスとも呼ばれます。
Java Serializable
はこれの完璧な例です。メソッドは定義されていませんが、確実に「実装」する必要があるすべてのクラスは、本当にシリアライズ可能であり、参照を保持していません。データベース接続、開いているファイルなど、シリアル化できないものに.
Javaでは、通常、クラスの「タグ付け」に空のインターフェースが使用されていました。最近では、通常、注釈が使用されていました。
これは、クラスに「このクラスは<this>
一般的なメンバーが関与しない場合でも使用できます。
通常は属性に似ています。空のインターフェースよりも属性の使用が推奨されます(少なくともFxCopが認識している限り)。ただし、.NET自体は、IRequiresSessionState
やIReadOnlySessionState
などのこれらのインターフェイスの一部を使用します。代わりにインターフェースを使用する属性を使用すると、メタデータの検索でパフォーマンスが低下すると思います。
空のインターフェースは、インターフェースの動作で指定されていないデータ型のプレースホルダーとして機能します。
Javaでは、インターフェース拡張のメカニズムが良い使用例です。たとえば、次のようにするとします
interface one {}
interface two {}
interface three extends one, two {}
インターフェース3は「1」と「2」の動作を継承するため、
class four implements three { ... }
タイプが「3」である2つのメソッドを指定する必要があります。
ご覧のとおり、上記の例から、空のインターフェースは多重継承のポイントと見なすこともできます(Javaでは許可されていません)。
これがさらなる視点で明確になることを願っています。
過去1年間NServiceBusで作業してきました。私はdi Dahanについては言いませんが、私の理解は、このインターフェースが実際にmarkerとして実際に使用されていることです。
彼に将来の延長のためにこれを残しておくことを考えていたかどうか、彼自身に尋ねることをお勧めしますが。私の賭けはノーです。マントラはメッセージを非常にシンプルにするか、少なくとも実際にはプラットフォームにとらわれないようにすることです。
他の人は空のインターフェースのより一般的な理由でうまく答えます。
「将来の」参照に使用したり、いくつかのオブジェクトを共有したい場合は、このインターフェイスを実装する10個のクラスを使用できると言います。
そして、それらを機能させるために関数に送ってもらえますが、インターフェースが空の場合は、まさに「事前」の作業だと思います。
これらは「Mark Interfaces」と呼ばれ、マークされたクラスのインスタンスを通知することを目的としています。
たとえば、C++では、「ICollectible」オブジェクトとしてマークを付けて、型指定されていない一般的なコレクションに格納できるようにするのが一般的です。
だから誰かが言うように、彼らは収集、シリアル化などの機能のような、オブジェクトがサポートする振る舞いを合図することです。
空のインターフェースは、特定のインターフェースを実装するクラスが特定の動作を持っていることを文書化するために使用されます
たとえば、JavaのCloneable
インターフェースは、Javaの空のインターフェースです。クラスがCloneable
インターフェースを実装すると、その上でrun clone()
を呼び出すことができることを知っています。
空のインターフェースを使用してクラスをマークします。実行時に、インターフェースを使用して型チェックを実行できます。
たとえば、Javaプログラミング言語からのマーカーインターフェースのアプリケーションはSerializableインターフェースです。クラスはこのインターフェースを実装して、非一時的なデータメンバーをObjectOutputStreamに書き込むことができることを示します。ObjectOutputStreamプライベートメソッドwriteObject()には、書き込み可能性を判別するための一連のinstanceofテストが含まれており、そのうちの1つはSerializableインターフェースを探します。これらのテストのいずれかが失敗した場合、メソッドはNotSerializableExceptionをスローします。