如果未使用Concrete实现初始化CLR Load接口类型吗?
考虑具有实现FooImpl
的接口IFooe.g。
IFoo foo;
而不是
IFoo foo = new FooImpl();
CLR只会在第二种情况下加载IFoo类型吗?另外,如果有另一种类型继承自FooImpl(例如FooImpl2)
此代码是否会从FooImpl2开始并继续继承层次结构以加载IFoo接口?此外,IFoo的MethodTable是否包含一个直接指向FooImpl2方法表的指针,或者它是否会通过中间实现类型(即FooImpl)重定向。
IFoo foo = new FooImpl2();
答案 0 :(得分:2)
这行代码
IFoo foo;
表示foo
是一个变量,可以保存对实现接口IFoo
的对象的引用。
CLR是否仅在第二种情况下加载IFoo类型?
在第二种情况下,您创建了一个FooImpl
类型的对象,并使用一个名为foo
的变量来存储对该对象的引用。为了使变量保存对象的引用,变量的类型应该符合此对象。说合规,我的意思是变量的类型与您创建的对象相同,或者是基本类型或接口。据说没有任何接口负载。
这行代码:
IFoo foo = new FooImpl();
表示foo
将保存对实现IFoo
接口的对象的引用,只是这个。
此外,如果有另一种类型继承自FooImpl(例如 FooImpl2)这段代码将从FooImpl2开始并向上走 继承层次结构加载IFoo接口?
没有
此外,IFoo的MethodTable是否包含一个直接指向的指针 FooImpl2的方法表或将通过中间体重定向 实现类型(即FooImpl)。
将存储在变量中的引用将指向FooImpl2的方法表direclty。实际上,它会指向存储在堆中的具体对象,并且会引用方法的FooImpl2
表。