What is the difference between IFoo foo = new Foo() and Foo foo = new Foo()
1 2
| public class Foo : IFoo
... |
两者有什么区别
和
- 多次重复,包括stackoverflow.com/questions/1484445/…
- 另外:stackoverflow.com/questions/1595498/…
- C中有些微妙之处在爪哇并不存在。看看我对乔恩答案的评论。
区别就在于变量的声明类型。然后,每当使用表达式foo时,编译器都将使用该类型。例如,假设foo类包含一些不在IFoo中的方法。在第一个声明中,该成员将不可见-您必须将foo强制转换为类型foo,才能调用它。在第二个声明中,您可以直接访问它。
相反,对于IFoo的成员是正确的,这些成员在foo中通过显式接口实现实现。这是相对罕见的,但确实发生了。
使用第一个声明,还可以将变量重新分配给对实现IFoo类型的任何其他对象的引用,例如。
1
| foo = new SomeOtherIFooImplementation (); |
而对于第二个声明,您只能分配与foo兼容的值,即foo或派生类的实例。(当然,在这两种情况下,您都可以将变量设置为空。)
通常,将代码编写到接口而不是特定的实现是有利的。这意味着编译器将阻止您使用特定于实现的细节,而这又意味着将来更容易更改为其他实现。
变量的类型也会影响过载分辨率:
可以根据foo是声明为foo还是IFoo调用不同的方法。
基本上,变量的编译时类型在所有方面都很重要-几乎每次使用变量时,代码含义的某些方面都取决于变量的类型。
- 我想补充一点,在foo中显式实现的ifoo的任何成员在第二个声明中不可见,但在第一个声明中可见。
- @乔伦:打得好。将编辑。
- 乔恩,你的声誉几乎是直线增长,每个月增长大约15700。考虑到常见问题解答说你一天最多只能做200次重复,30天一个月最多只能做6000次重复。现在你怎么做到了两次以上?你要带我们到这里来!
- @callum:不是每月15700次,否则我会有超过20万次的回复:)但是,通过接受答案,你可以在一天内获得超过200次的回复。我想我的平均每天280英镑。
- 啊哈,这就解释了。(我只看了7个月,而不是一年,因为你的用户页面上有信誉图。我的错误)
- 非常感谢乔恩,你是英雄:)
如果foo是ifoo类型,并且foo实现了ifoo中未定义的方法或属性,则除非将foo强制转换为foo,否则无法访问这些方法或属性。
如果foo是ifoo类型,则可以实例化其他类型,这些类型也从ifoo中插入,并将其分配给foo。它更抽象,所以您并不具体依赖于foo类型。
第一个例子是实现ifoo的某个对象的实例。第二个例子是一个foo对象的实例。