7

私はインターフェースを持っています:

interface IFoo {
  int foo(int bar);
}

インターフェイスに準拠するように既存のクラスを拡張できますか? クラス文字列と言います。文字列に対して foo() メソッドを定義できることはわかっています。しかし、さらに進んで、文字列を IFoo にキャストできることをコンパイラに伝えることは可能でしょうか?

4

2 に答える 2

9

System.String他のクラスではできますが、ではできませんsealed

シールされていないクラスに対してこれを行いたい場合は、単純にそこから派生させ、適切なコンストラクターを追加し、インターフェイスを新しいクラスが実装するものとして配置することができます。

interface IFoo {
    int Size {get;}
}
// This class already does what you need, but does not implement
// your interface of interest
class OldClass {
    int Size {get;private set;}
    public OldClass(int size) { Size = size; }
}
// Derive from the existing class, and implement the interface
class NewClass : OldClass, IFoo {
    public NewCLass(int size) : base(size) {}
}

クラスが封印されている場合、構成を通じて何らかのインターフェイスとしてそれを提示する唯一の解決策: インターフェイスを実装するラッパー クラスを作成し、それに封印クラスのインスタンスを与え、ラップされたクラスのインスタンスに呼び出しを「転送」するメソッド実装を作成します。対象クラス。

于 2013-10-13T02:43:15.060 に答える
1

この質問は、「拡張メソッドを使用して、封印されたクラスに、以前には実装されていなかったインターフェイスを実装させることはできますか?」と言い換えることができると思います。他の人が指摘しているように、String クラスは封印されています。ただし、クラスが宣言で実装するインターフェイスに名前を付ける必要があると思います。

public someClass : IFoo
{
    // code goes here
}

したがって、封印されているだけでなく、ソースコードがないため、これを String に対して直接行うことはできません。

あなたができる最善の方法は、文字列を持つ独自のクラスを作成し、それを文字列のように使用することです。String が行う必要があることはすべて、その String メンバーで行う必要がある (したがって公開する) か、必要なメソッドをラップ/再実装する必要があります。

public class betterString : IFoo
{
   public String str {get; set;}

   public foo(int i)
   {
      // implement foo
   }
}

その後、それを使用するとき:

public void someMethod(betterString better)
{
   better.foo(77);
   System.Console.WriteLine(better.str);
}
于 2013-10-13T02:56:59.483 に答える