私は、インタフェースの範囲を超えて、他のプログラマと紛争しています。基本的なC#インターフェイスのスコープとは何ですか?
は、我々は次のことを考えてみます。
public interface IFoo
{
string Bar { get; set; }
}
public class SomeFoo: IFoo
{
public string Bar { get; set; }
public SomeFoo(string bar)
{
this.Bar = bar;
}
}
public class Consumer
{
public void DoSomething()
{
SomeFoo fooClassInstance = new SomeFoo("test");
IFoo fooInterface = (IFoo)fooClassInstance;
// do something with fooInterface.
}
}
そこで質問です: 1.それは何か他のものがfooInterfaceインスタンスを解放する前にfooClassInstanceがスコープの外に出ることは可能ですか?
オブジェクト(fooClassInstance)がスコープ外に出る可能性があると主張する人もいます。
私はそれが傾けると信じています。 GCがオブジェクトがスコープ内に存在しなくなったと判断した場合、オブジェクトはGCによって廃棄される場合もあれば、処理されない場合もあります。しかしながら、インタフェースは設計上、抽象的な契約であり、それを使用するオブジェクトによってメンバを実装する必要があります。インタフェースが使用されている限り、インタフェースは実装を失うことができません。まったく別のオブジェクトがタイプ "インタフェース"として作成されているようなものではありません。インタフェースは、単に実装者の抽象メンバへのポインタにすぎません。
この紛争を解決するお手伝いができますか?
おかげで、
<bleepzter />
インターフェイスには実装がありません。したがって、インターフェイスを実装しているクラスは範囲外になります。インターフェイスは契約のようなものです。実装することはあなたが実装する予定のものなので、ガベージコレクトするものはありません。あなたの例では、元のオブジェクトへの参照を作成し、それをインターフェイスにキャストしています。これはCOMの古いIUnknown :: QueryInterfaceでした(しかし、現在は同じ概念です)。 – SRM
あなたの例では、クラスインスタンスとインターフェイスインスタンスの両方が同時にスコープから外れます。 – Victor
'fooClassInstance'を' IFoo'にキャストする必要はありません。すでに* IFooです。 –