1

特定の数のアイテムのみを保持するスタックであるというクラスを作成し、MostRecentStack<T>アイテムを一番下にドロップして新しいアイテムのためのスペースを作りました。状況に応じて、通常の (「無限」) スタックまたはカスタム型のいずれかへの参照を格納できる変数が必要ですが、C# では汎用の「スタック」インターフェイスが定義されていません。System.Collections.Generic.Stack<T>通常はこれで問題ありませんが、インターフェイスも実装したいと思います。

クラスが必要なメンバーを提供する限り、インターフェイス定義で、クラスがインターフェイスを実装していると見なすようにコンパイラに指示する方法はありますか? as型キャストの他の方法を使用しなくても、これを実行できるようにしたいと思います。

4

2 に答える 2

4

あなたが求めている正確なことは不可能です。ただし、次のようなものは、必要なものと非常に似ている必要があります。

public class CompatibleStack<T> : System.Collections.Generic.Stack<T>, IYourStackInterface<T>
{
}

CompatibleStack は、System.Collections.Generic.Stack と機能的に同等ですが、IYourStackInterface を実装するようになりました。

System.Collections.Generic.Stack に IYourStackInterface を実装する適切なメンバーがすべて含まれている限り、これは正常にコンパイルされます。また、CompatibleStack を IYourStackInterface として問題なく渡すことができます。

于 2013-11-02T02:57:35.777 に答える
4

いいえ、所有していない既存のクラスに新しいインターフェイスを追加することはできません。オプション:

  • 依存性注入コントローラーを介してクラスのインスタンスを取得すると、一致するメソッドを呼び出すことによってインターフェイスを実装するプロキシでクラスをラップできる場合があります。
  • 既存のクラスから派生させてインターフェイスを追加し (シールされていない場合)、クラスの使用を開始するだけです。
  • あなたの特定のケースでは、ボールドリックが指摘したように、既存のクラスから派生させてインターフェースを実装することができます。
  • dynamicパフォーマンス、読みやすさ、強い型のコストのために、いくつかのダックタイピングを取得するために使用することができます (両方のクラスに一致するメソッドがあるため)。

補足: 一般に、C# はダック タイピングをサポートしていませんが、1 つのケース ( foreach) では、インターフェイスの実装が厳密には必要ありません。コレクションに正しいメソッドを用意するだけでforeach.

于 2013-11-02T02:57:47.323 に答える