c# - 纯抽象类和接口(interface)之间的区别

标签 c# java oop

我正在与一位同事讨论,他坚持认为在 Java 和 C# 等语言中,没有任何理由使用纯抽象基类,因为它只是意味着您无法解决缺乏多重继承的问题.

我觉得他在这点上是错误的,因为我一直认为一个事物如果是名词就是宾语,如果是动词就是接口(interface)。

例如,如果我想定义类型 Bird,我想在其中强制执行 fly 方法而不实现它,那么我会将其设为纯抽象类。

如果我想定义一个类型Flies,我会用fly方法使它成为一个接口(interface)。

Bird 可能会实现 Flies

我错了吗?

编辑:

我能给出的唯一有力的论据来支持我的观点是,在未来的某个时候,设计可能需要改变,以便鸟类可以吃东西。如果所有的鸟都吃同样的东西,那么这将需要添加到 Bird 中,使其非纯抽象。

如果 Bird 是一个接口(interface),那么这种变化简直就是一场噩梦,因为我不知道从其他基类继承的东西是否也实现了我的 Bird 接口(interface),所以我不能只是重构我的问题。

最佳答案

我能想到至少一个很好的理由:您可以稍后扩展抽象类,而不会破坏向后兼容性:假设一个类/接口(interface)

abstract class/interface Foo {
    void foo();
}

如果我们使用一个接口(interface),我们现在可以肯定地知道永远无法向 Foo 添加额外的功能。这可能会导致 interface Foo2 implements Foo 之类的事情。

另一方面,如果你有一个抽象类,你可以很容易地向它添加另一个方法,只要你提供一个基本的实现。

请注意,Java8 将允许接口(interface)做基本相同的事情 - 这对于希望更新其库以使用 lambdas 而不必破坏与已编写的数百万行代码的兼容性的库编写者将非常有用。

关于c# - 纯抽象类和接口(interface)之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9497729/

相关文章:

c# - 身份验证 gmail api C# windows phone 8.1

c# - 表值参数不允许使用数据库名称

c# - 将 C# 字节转换为 BitArray

c# - C#从文本文件中读取数字

c++ - 初始化数据成员的列表的正确术语是什么?

java - 为类型安全扩展字符串 - Java

java - Android:如何检测 Assets 文件夹中的目录?

java - 如果线程获得了对象的锁怎么办

java - 使用 play-framework 2.5.x java 创建表单?

java - 覆盖java子类中的参数化构造函数