2015-02-09 39 views
1

我对接口和抽象类感到困惑我知道它们之间的技术差异就像接口不能有字段,而抽象可以,而接口应用多重继承,而抽象类不能。为什么选择抽象(没有默认实现)通过接口vb.net?

我想知道如果我有一个抽象类有4个方法,但没有默认实现,并且我有4个方法的接口太确定没有实现,那么使用它们之间有什么区别?他们对我来说看起来一样!

当我可以在这种情况下选择接口的抽象类吗?

+0

在一个* corner *的情况下,你有一个抽象类,实现了0%的方法,它们确实类似于接口。但是这远远不是常用的*用法,其中一些或所有的方法都会有一个(默认)实现。 – 2015-02-09 09:14:54

+0

在某些情况下,您可以声明接口public和abstract class为internal或private,以便任何外部代码只知道和使用接口,而您的抽象类为您提供默认(或空的)接口实现。然后,您将从抽象类派生出一些其他(具体)类,以满足彼此不共同的特定需求,因此不能直接实现到抽象(基类)类中。当你(真的)需要不同的类似的类来共享一些共同的行为,但想要隐藏它们的存在时,这个层次结构可能是有用的。 – 2015-02-09 09:35:11

+0

谢谢你的回答 – 2015-02-09 12:26:02

回答

1

的规则来选择它们是:

  1. 要指定一个类来实现始终使用的界面,你可以使用多重继承与接口的方法。
  2. 如果您有一些必须在接口的实现者之间共享的实现,请使用抽象类。

如果你有一个空的抽象类,它应该总是被一个接口替换。

0

抽象类通过接口提供至少有三个好处:

  1. 抽象类可以有字段,但接口不能。虽然面向公众的对象不应该有公共字段,但对于其实例永远不会暴露给公众的类别有时可能会这样做。例如,类型为Int32的字段可以安全地作为ref参数安全地传递给通过例如参数更新它的方法。 Interlocked.Increment;一个财产不能。尽管可能组合Int32类型的属性,并且还提供了诸如AtomicIncrementFoo之类的方法,但使用字段可避免需要大量样板代码。

  2. 抽象类可以重载操作符,包括隐式和显式类型转换。至少在C#中,接口不能这样做。

  3. 抽象类可以为方法定义默认实现,但即使实现接口的类的99%会为方法使用相同的代码,每一个类都必须单独定义void SomeMethod(int Foo) { MyInterfaceHelper.SomeMethod(this, Foo); }。这不仅需要大量的样板代码,而且希望最大限度地减少样板代码,这导致接口作者忽略了接口真正应该包含的东西。

我不知道有什么理由.NET和相关的语言不能给接口提供上述的能力,但是现在还没有。

相关问题