【问题标题】:What is the difference between IFoo foo = new Foo() and Foo foo = new Foo()IFoo foo = new Foo() 和 Foo foo = new Foo() 有什么区别
【发布时间】:2010-12-12 02:28:42
【问题描述】:
public class Foo : IFoo
...

有什么区别

IFoo foo = new Foo();

和

Foo foo = new Foo();

【问题讨论】:

标签: c# .net interface


【解决方案1】:

区别仅在于变量的声明类型。每当您使用表达式foo 时,编译器都会使用该类型。例如,假设Foo 类包含一些在IFoo 中不 的方法。使用第一个声明,该成员将不可见 - 您必须将 foo 转换为 Foo 才能调用它。在第二个声明中,您可以直接访问它。

IFoo 的成员则相反,这些成员在 Foo 中使用 explicit interface implementation 实现。这相对很少见,但确实会发生。

使用第一个声明,您还可以将变量重新分配给对实现IFoo 类型的任何其他对象的引用,例如

foo = new SomeOtherIFooImplementation();

而对于第二个声明,您只能分配与Foo 兼容的值——即Foo 或派生类的实例。 (当然,在这两种情况下,您都可以将变量设置为 null。)

通常对接口而不是特定实现进行编码更有优势。这意味着编译器将阻止您使用特定于实现的细节,这反过来意味着将来更改为不同的实现可能会更容易。

变量的类型也会影响重载决议:

DoSomething(foo);

可能会调用不同的方法,具体取决于 foo 是声明为 Foo 还是 IFoo。

基本上,变量的编译时类型在各个方面都很重要 - 几乎每次使用变量时,该代码的某些含义都将取决于变量的类型。

【讨论】:

  • 我想补充一点,已在 Foo 中显式实现的任何 IFoo 成员在第二个声明中不可见,但在第一个声明中可见。
  • Jon,你的声望几乎是线性增长的,每月增长大约 15,700。考虑到常见问题解答说您每天最多只能获得 200 个代表,那么您在 30 天的一个月中最多应该能够获得 6000 个代表。现在你是怎么过去并克服了两倍的呢?你在这里向我们展示!
  • @Callum:这不是每月 15,700 - 否则我将有超过 200K 代表 :) 但是,通过接受答案,您可以在一天内获得超过 200 个代表。我想我的平均每天大约是 280 次。
  • 啊哈,这就解释了。 (由于您的用户页面上的声誉图,我只查看了 7 个月,而不是一年。我的错误)
【解决方案2】:

如果 foo 是 IFoo 类型,并且 Foo 实现了未在 IFoo 中定义的方法或属性,则除非将 foo 强制转换为 Foo,否则您将无法访问它们。

如果 foo 是 IFoo 类型,您可以实例化同样从 IFoo 继承的其他类型并将其分配给 foo。它更加抽象,因此您并不特别依赖于 Foo 类型。

【讨论】:

    【解决方案3】:

    第一个例子是一些实现 IFoo 的对象的实例。 第二个例子是一个 Foo 对象的实例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-27
      • 1970-01-01
      • 1970-01-01
      • 2019-05-27
      • 2017-06-23
      • 2011-11-23
      • 2015-03-08
      • 2018-07-01
      相关资源
      最近更新 更多