22
public sealed interface IMyInterface
{
}

「修正された 'sealed' はこのアイテムには無効です」

インターフェイスが継承可能でなければならないことは、いくつかの点で理解できます。そうでなければ、クラスはそれを実装できません。

しかし、インターフェイスにサブ インターフェイスを定義しないように指定できないのはなぜsealedですか。

編集

なぜこれが必要なのかを説明するために、いくらかの努力を払うべきでした。開発者が代わりに構成を使用する必要があるインターフェイス継承チェーンをよく見かけます。Sealed はクラスでこれに理想的であり、インターフェイスに同じことを強制する方法があるかどうか疑問に思いました。私の意見では、不必要な継承により、リファクタリングと保守が難しくなります。

編集 2

コメントや投稿を反映して、インターフェイスの継承ツリーは、オブジェクトの継承ツリーほど複雑ではありません。別のインターフェースから派生している場合と同様に、IX「実装する必要がある」と言っているだけですIX。そして、それを防止しても何のメリットもありません。

4

8 に答える 8

25

クラスまたはクラスの仮想メソッドを封印する目的は、コストを下げることです。継承のための設計はコストがかかり、正しく行わないと危険です。継承用に設計しないと、セキュリティ、正確性、および堅牢性に影響するため、継承用に設計するつもりがない場合は、クラスを封印して、継承用の設計に関連するコストを回避することをお勧めします。

クラスには実装の詳細があるため、継承用に設計する必要があります。インターフェイスには実装の詳細はありません。インターフェイスを継承可能にすることに関連するコストはありません。したがって、インターフェイスを封印できるようにする機能を追加するインセンティブはありません。

于 2012-03-27T13:51:43.817 に答える
14

混乱するだけです。標準の構文を使用すると、インターフェイスを実装できないことを意味します。また、インターフェイスには機能やフィールドが含まれていないため、封印しても実用的ではありません。インターフェイスは多かれ少なかれコントラクトです。

「インターフェースの継承」からインターフェースを封印しても、何もしません。なぜなら、人々はあなたのインターフェースと、あなたのインターフェースを継承したであろう他のインターフェースを実装することができるからです。

于 2012-03-27T13:39:54.893 に答える
5

sealedインターフェイスのコンテキストでは、どのクラスもこのインターフェイスを実装できないことを意味します。それは役に立たないので、許可されていません。

于 2012-03-27T13:39:21.320 に答える
1

キーワードは、sealedインターフェイス用に設計されていません (そして意味がありません)。msdn のドキュメントhttp://msdn.microsoft.com/en-us/library/88c54tsw(v=vs.71).aspxを参照してください。

于 2012-03-27T13:39:26.487 に答える
0

クラスをシールする主な目的の1つは、派生型ではなく、その正確な型のインスタンスを保持するために、そのクラスの任意の格納場所を要求することです。ほとんどのコードは、派生型オブジェクトが基本型オブジェクトに置き換えられてもかまいませんが、そのような置換が問題になる可能性がある多くの状況があります。たとえば、一部のクラスには、同じタイプの別のオブジェクトとの相対比較を実行する関数が含まれており、比較結果によってソート可能なシーケンスが生成されることが期待されます。タイプBarBoz両方がから派生し、比較で特定のフィールドまたは特定のフィールドFooを使用する場合、とインスタンスの混合を保持するシーケンスを適切にソートすることは不可能な場合があります。BarBozBarBoz

インターフェイスはその性質上、複数のクラスによって実装されるように設計されているため、このような目的はインターフェイスには存在しません。どのクラスでも実装できなかったインターフェースは役に立たず、1つのクラスでしか実装できなかったインターフェースは無意味になります(IFoo以外の何物でもない場合は、どこでもFoo簡単に使用Fooできます。使用する傾向がありますIFoo)。

インターフェイスの実装を、それが定義されているモジュールに制限したり、インターフェイスにinternalメンバーを持たせたりすることには、ある程度の有用性があります。それが許可されない特別な理由はわかりません。また、そのようなことを許可または禁止することが、禁止するよりも「簡単」または「困難」だったのかどうかさえわかりません。

于 2012-03-28T17:47:50.203 に答える
0

インターフェイスはアプリケーション コントラクトです...コントラクトが必要ないのに、なぜそれを定義するのですか?

于 2012-03-27T13:54:12.377 に答える
0

Sealedはクラスのキーワードです。インターフェイスの目的は、クラスが定義するコントラクトを実装することです。インターフェイスを実装するクラスを封印することはできますが、インターフェイスを封印してもほとんど役に立ちません。

于 2012-03-27T13:40:10.113 に答える
-1

私にとっては、キーワードinterfaceを意味します。したがって、インターフェイスが になる場合、それは矛盾しているように見えるものになります。abstractsealedsealed abstract

于 2012-03-27T13:42:53.817 に答える