为什么选择抽象(没有默认实现)而不是接口 vb.net?
why to choose abstract(without default implementation) over interface vb.net?
我对接口和抽象感到困惑 classes 我知道它们之间的技术差异,比如接口不能有字段而抽象可以,接口应用多重继承而抽象 classes不能。
我想知道我是否有一个抽象 class 有 4 个方法但没有默认实现,我有 4 个方法的接口太确定没有实现,那时候使用它们有什么区别?它们对我来说看起来一样!
在那种情况下我什么时候可以选择抽象 class 而不是接口?
select 他们的规则如下:
- 要指定 class 必须实现的方法,请始终使用接口,因为您可以对接口使用多重继承。
- 如果您有一些必须在接口的实现者之间共享的实现,请使用抽象 class。
如果你有一个空的抽象class,它应该总是被一个接口替换。
抽象 类 提供至少三个优于接口的优势:
抽象类 可以有字段,但接口不能。虽然面向 public 的对象不应该有 public 字段,但它有时可能对 类 有利,因为它们的实例永远不会暴露给 public 这样做。例如,Int32
类型的字段可以安全地作为 ref
参数传递给通过例如更新它的方法。 Interlocked.Increment
; 属性 不能。虽然可以组合 Int32
类型的 属性 并提供类似 AtomicIncrementFoo
的方法,但使用字段可以避免需要大量样板代码。
Abstract 类 可以重载运算符,包括隐式和显式类型转换。接口不能这样做,至少在 C# 中是这样。
抽象 类 可以定义方法的默认实现,但即使实现接口的 99% 类 都将使用相同的方法代码,每个人都必须分别定义void SomeMethod(int Foo) { MyInterfaceHelper.SomeMethod(this, Foo); }
。这不仅需要大量样板代码,而且尽量减少样板代码的愿望经常导致界面作者忽略界面真正应该包含的内容。
我不知道 .NET 和相关语言无法为接口提供上述能力的任何原因,但到目前为止它们还没有。
我对接口和抽象感到困惑 classes 我知道它们之间的技术差异,比如接口不能有字段而抽象可以,接口应用多重继承而抽象 classes不能。
我想知道我是否有一个抽象 class 有 4 个方法但没有默认实现,我有 4 个方法的接口太确定没有实现,那时候使用它们有什么区别?它们对我来说看起来一样!
在那种情况下我什么时候可以选择抽象 class 而不是接口?
select 他们的规则如下:
- 要指定 class 必须实现的方法,请始终使用接口,因为您可以对接口使用多重继承。
- 如果您有一些必须在接口的实现者之间共享的实现,请使用抽象 class。
如果你有一个空的抽象class,它应该总是被一个接口替换。
抽象 类 提供至少三个优于接口的优势:
抽象类 可以有字段,但接口不能。虽然面向 public 的对象不应该有 public 字段,但它有时可能对 类 有利,因为它们的实例永远不会暴露给 public 这样做。例如,
Int32
类型的字段可以安全地作为ref
参数传递给通过例如更新它的方法。Interlocked.Increment
; 属性 不能。虽然可以组合Int32
类型的 属性 并提供类似AtomicIncrementFoo
的方法,但使用字段可以避免需要大量样板代码。Abstract 类 可以重载运算符,包括隐式和显式类型转换。接口不能这样做,至少在 C# 中是这样。
抽象 类 可以定义方法的默认实现,但即使实现接口的 99% 类 都将使用相同的方法代码,每个人都必须分别定义
void SomeMethod(int Foo) { MyInterfaceHelper.SomeMethod(this, Foo); }
。这不仅需要大量样板代码,而且尽量减少样板代码的愿望经常导致界面作者忽略界面真正应该包含的内容。
我不知道 .NET 和相关语言无法为接口提供上述能力的任何原因,但到目前为止它们还没有。