【问题标题】:Is an abstract class without any implementation and variables effectively interface? [closed]没有任何实现和变量的抽象类是否有效接口? [关闭]
【发布时间】:2020-11-12 22:23:46
【问题描述】:

我正在复习 OOP 的概念,正在阅读。

这里本书将接口定义为

由对象的操作定义的所有签名的集合称为对象的接口。 (第 39 页)

和抽象类一样

抽象类的主要目的是为其子类定义一个公共接口。抽象类将其部分或全部实现推迟到子类中定义的操作;因此无法实例化抽象类。抽象类声明但未实现的操作称为抽象操作。非抽象的类称为具体类。 (第 43 页)

我想知道,如果我定义一个没有任何内部数据(变量)和具体操作的抽象类,只是一些抽象操作,它实际上不只是一组签名吗?那不就是一个界面吗?

所以这是我的第一个问题:

  1. 我可以说只有抽象函数的抽象类是“实际上(或理论上)”一个接口吗?

然后我想,这本书也谈到了类型和类。

对象的类定义了对象的实现方式。该类定义对象的内部状态及其操作的实现。相反,一个对象的类型只指它的接口——它可以响应的一组请求。一个对象可以有多种类型,不同类的对象可以有相同的类型。 (第 44 页)

然后我记得有些语言,比如Java,不允许多重继承,但它允许多重实现。所以我猜对于某些语言(如 Java),只有抽象操作的抽象类!= 接口。

这是我的第二个问题:

  1. 我可以说只有抽象函数的抽象类是“通常等同于”支持多重继承的语言中的接口吗?

我的第一个问题是检查定义,第二个问题是关于其他语言的工作原理。我主要使用 Java 和 Kotlin,所以我不太确定其他支持多重继承的语言。我不希望对当前的 OOP 语言进行一般、全面的审查,但对单一语言(可能是 python?)的一点提示会很有帮助。

【问题讨论】:

  • 我认为以下链接可能会有所帮助:interface-vs-abstract-class-general-oo
  • @Hülya 是的,有点,但我的问题不是关于抽象类和接口如何使用/感知,而是实现。我想用所有抽象方法编写一个抽象类是一个糟糕的设计选择。但除了它是糟糕的设计选择之外,它们本质上是等价的吗?再想一想,我的问题可以解释为“我们可以将类型与类分开吗?”或“类是否意味着类型?”

标签: java python oop inheritance design-patterns


【解决方案1】:
  1. 没有。

在Java 中,每个类都是Object 的子类,因此您不能创建一个只有抽象方法的抽象类。它将始终具有从Object 继承的方法实现:hashCode()equals()toString() 等。

  1. 是的,差不多。

例如,在 C++ 中,没有特定的 interface 关键字,接口只是一个没有实现的类。 C++ 中没有通用的基类,所以你真的可以创建一个没有实现的类。

多重继承并不是真正的决定性特征。 Java 具有一种多重继承,具有称为“接口”的特殊类,甚至可以具有default 方法。

真正与众不同的是通用基类Objectinterface 是您创建不继承自 Object 的类的方式。

【讨论】:

    猜你喜欢
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    • 2020-10-20
    • 2015-06-27
    • 1970-01-01
    • 2015-03-17
    • 2014-02-05
    • 2012-07-17
    相关资源
    最近更新 更多