我对这两个感到困惑。我学到的是,抽象数据类型是数据类型的数学模型,它指定了对象和操作这些对象的方法,而不指定对象和方法的实现细节。例如:抽象堆栈模型定义了一个堆栈,其中包含推送和弹出操作,用于向堆栈插入项目和从堆栈删除项目。我们可以通过多种方式实现这一点,例如使用链表、数组或类。
现在,来到抽象类的定义,它是一个父类,它有一个或多个没有定义(实现?)并且不能被实例化的方法(就像我们不能实现一个抽象堆栈一样,因为它是,没有通过具体数据结构之一定义堆栈的底层机制)。例如:如果我们有一个名为 Mammal 的抽象类,其中包含一个名为 eat() 的函数,我们不知道哺乳动物是如何进食的,因为哺乳动物是抽象的。虽然我们可以为奶牛定义 eat(),它是哺乳动物的派生类。这是否意味着 mammal 充当 adt 而 cow 类是 mammal adt 的实现?
如果我有任何错误,请纠正我。任何形式的帮助将非常感激。
最佳答案
Abstract data type is a mathematical model for data type...
Now, coming to the definition of abstract class...
您需要区分理论数学模型和实际实现技术。
模型是由人们创建的,目的是为了以某种可理解的、概括的方式轻松地推理问题。
与此同时,编写实际代码是为了工作并完成工作。
“抽象数据类型”是模型。 “抽象类”是一些编程语言(C++、C#、Java)在语言层面上支持的一种编程技术。
“抽象数据类型”让您可以思考和讨论问题的解决方案,而不会让您的大脑因不必要的(此时)实现细节而重载。当您需要 FIFO 数据结构时,您只说“堆栈”,而不是“带有指向头节点的指针和...能力的双向链表”.
“抽象类”让您编写代码一次,然后再重用它(因为这就是 OOP 的要点 - 代码重用)。当您看到几种类型具有共同的接口(interface)和功能时 - 您可以创建“抽象类”并将它们的功能交集放在里面,同时仍然能够依赖尚未实现的功能,这些功能将由一些具体类型实现之后。这样,您只需编写一次代码,以后需要更改它时 - 只需在一个地方进行更改。
注意:
尽管在C++ ISO 标准(至少在草案中)有注释:
Note: The abstract class mechanism supports the notion of a general concept, such as a shape, of which only more concrete variants, such as circle and square, can actually be used.
但这只是一个注释。真正的定义是:
A class is abstract if it has at least one pure (aka unimplemented) virtual function.
这导致明显的限制:
no objects of an abstract class can be created except as subobjects of a class derived from it
就个人而言,我喜欢 C++(与 C# 和 Java 不同)没有关键字“抽象”。它只有类型继承和虚函数(可能仍未实现)。这有助于您专注于实际问题:在需要的地方继承,在需要的地方覆盖。
简而言之,使用 OOP - 务实。
关于c++ - 抽象类是抽象数据类型的一个例子吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48839522/