我对Interfaces和Abstract类感到困惑我知道它们之间的技术差异就像接口不能有字段而抽象可以,而接口也应用多重继承而抽象类不能。
我想知道我是否有一个带有4个方法但没有默认实现的抽象类,并且我有4个方法的接口太确定没有实现,那时使用它们有什么区别?它们看起来和我一样!
在那种情况下我可以选择抽象类而不是接口吗?
答案 0 :(得分:1)
选择它们的规则如下:
如果你有一个空的抽象类,它应该总是用接口替换。
答案 1 :(得分:0)
抽象类比接口提供至少三个优点:
抽象类可以有字段,但接口不能。虽然面向公众的对象不应该有公共字段,但对于其实例永远不会暴露给公共的类,它有时可能是有利的。例如,类型Int32
的字段可以安全地作为ref
参数安全地传递给通过例如更新它的方法。 Interlocked.Increment
;财产不能。虽然可以组合Int32
类型的属性并提供类似AtomicIncrementFoo
的方法,但使用字段可以避免需要大量的样板代码。
抽象类可以重载运算符,包括隐式和显式类型转换。接口不能这样做,至少在C#中。
抽象类可以定义方法的默认实现,但即使99%的实现接口的类对方法使用相同的代码,每个类都必须单独定义void SomeMethod(int Foo) { MyInterfaceHelper.SomeMethod(this, Foo); }
。这不仅需要大量的样板代码,而且最大限度地减少样板代码的需求经常导致接口作者省略接口真正应该包含的内容。
我不知道.NET和相关语言无法为接口提供上述功能,但是他们还没有。