public class Foo : IFoo
...
之间有什么区别
IFoo foo = new Foo();
和
Foo foo = new Foo();
答案 0 :(得分:10)
区别仅在于声明的变量类型。只要您使用表达式foo
,编译器就会使用该类型。例如,假设Foo
类包含IFoo
中不的某些方法。使用第一个声明时,该成员将不可见 - 您必须将foo
强制转换为Foo
来调用它。在第二个声明中,您可以直接访问它。
IFoo
的{{1}}成员在Foo
中使用explicit interface implementation实施的情况正好相反。 相对罕见,但确实发生了。
使用第一个声明,您还可以将变量重新分配给对实现IFoo
的类型的任何其他对象的引用,例如
foo = new SomeOtherIFooImplementation();
而对于第二个声明,您只能分配与Foo
兼容的值 - 即Foo
的实例或派生类。 (当然,在这两种情况下,您都可以将变量设置为null。)
通常,对接口而不是特定实现进行编码是有利的。这意味着编译器将阻止您使用特定于实现的细节,这反过来意味着将来可能更容易更改为不同的实现。
变量的类型也会影响重载决策:
DoSomething(foo);
可能会调用不同的方法,具体取决于foo
是Foo
还是IFoo
。
基本上,变量的编译时类型在各种方面都很重要 - 实际上每次使用变量时,该代码含义的某些方面将取决于变量的类型。
答案 1 :(得分:1)
如果foo的类型为IFoo,而Foo实现的方法或属性未在IFoo中定义,除非将foo转换为Foo,否则无法访问它们。
如果foo的类型为IFoo,则可以实例化其他类型,这些类型也会从IFoo中包含并将其分配给foo。它更抽象,所以你不是特别依赖于Foo类型。
答案 2 :(得分:0)
第一个例子是实现IFoo的某个对象的实例。 第二个例子是Foo对象的一个实例。