1

Concrete 実装で初期化されていない場合、CLR はインターフェイス型をロードしますか?

実装 FooImpl を持つインターフェース IFoo を検討する

例えば

IFoo foo;

とは対照的に

IFoo foo = new FooImpl();

2 番目のケースでは、CLR は IFoo タイプのみをロードしますか? また、FooImpl を継承する別の型がある場合 (例: FooImpl2)

このコードは FooImpl2 から開始し、継承階層をたどって IFoo インターフェイスをロードしますか? また、IFoo の MethodTable には FooImpl2 のメソッド テーブルへの直接のポインターが含まれますか、それとも中間の実装型 (つまり FooImpl) を介してリダイレクトされますか。

IFoo foo = new FooImpl2();
4

1 に答える 1

2

このコード行

IFoo foo;

fooは、インターフェイスを実装するオブジェクトへの参照を保持できる変数であると述べていますIFoo

2 番目のケースでは、CLR は IFoo タイプのみをロードしますか?

2 番目のケースでは、タイプのオブジェクトを作成し、このオブジェクトへの参照を格納するFooImplと呼ばれる変数を使用します。foo変数がオブジェクトへの参照を保持するには、変数の型がこのオブジェクトに準拠している必要があります。準拠しているとは、変数の型が作成したオブジェクトと同じか、基本型またはインターフェイスになることを意味します。そうは言っても、どのインターフェースにも負荷はありません。

このコード行:

IFoo foo = new FooImpl();

は、インターフェイスfooを実装するオブジェクトへの参照を保持すると述べていますが、これだけです。IFoo

また、FooImpl から継承する別のタイプ (FooImpl2 など) がある場合、このコードは FooImpl2 から開始し、継承階層を上って IFoo インターフェイスをロードしますか?

いいえ

また、IFoo の MethodTable には FooImpl2 のメソッド テーブルへの直接のポインターが含まれますか、それとも中間の実装型 (つまり FooImpl) を介してリダイレクトされますか。

変数に格納される参照は、FooImpl2 のメソッド テーブル ディレクトリを指します。実際には、ヒープに格納された具象オブジェクトを指し、メソッドのテーブルへの参照がありますFooImpl2

于 2015-08-08T08:48:09.603 に答える