public class Foo : IFoo
...
有什么区别
IFoo foo = new Foo();
和
Foo foo = new Foo();
Jon*_*eet 10
区别在于变量的声明类型.无论何时使用表达式,编译器都将使用该类型foo.例如,假设在Foo类包含一些方法,该方法是不在IFoo.使用第一个声明,该成员将不可见 - 您必须转换foo为类型Foo来调用它.在第二个声明中,您可以直接访问它.
相反的成员是真实的IFoo,其与实现显式接口实现在Foo.这是相对罕见的,但它确实发生了.
使用第一个声明,您还可以将变量重新分配给对实现类型的任何其他对象的引用IFoo,例如
foo = new SomeOtherIFooImplementation();
而对于第二个声明,您只能分配与其兼容的值Foo- 即实例Foo或派生类.(在这两种情况下,您都可以将变量设置为null.)
编码到接口而不是特定实现通常是有利的.这意味着编译器将阻止您使用特定于实现的细节,这反过来意味着将来可能更容易更改为不同的实现.
变量的类型也会影响重载决策:
DoSomething(foo);
根据是否foo声明为Foo或可以调用不同的方法IFoo.
基本上,变量的编译时类型在各种方面都很重要 - 实际上每次使用变量时,该代码含义的某些方面将取决于变量的类型.