d4r*_*rty 5 theory oop definition abstract-data-type
我已经阅读了很多关于抽象数据类型 (ADT) 的内容,我在问自己是否有非抽象/具体数据类型?
关于 ADT 的 SO 上已经有一个问题,但是这个问题不包括“非抽象”数据类型。
ADT 的定义只提到要执行哪些操作,而没有提到这些操作将如何实现
所以 ADT 对用户隐藏了具体的实现,并且“只”提供了一堆允许的操作/方法;例如,Java 中的堆栈(参考)。只有类似的方法pop(),push(),empty()是可见的,具体的实现是隐藏的。
遵循这个论证让我想到了一个问题,是否存在“非抽象”数据类型?
即使是java.lang.Integer像+, -, ...这样的原始数据类型也有明确定义的操作,根据维基百科,它是 ADT。
例如,整数是一个 ADT,定义为值 …, ?2, ?1, 0, 1, 2, …,并通过加、减、乘、除运算,加上大于、小于,等等。,
这java.lang.Integer不是原始类型。它是一个包装原始 java 类型的 ADT int。这同样适用于其他 Java 基本类型和相应的包装器。
您不需要某种语言的 OOP 支持来拥有 ADT。如果您没有支持,则可以在编写的代码中建立 ADT 的约定(即,您仅将其用作先前由 ADT 的操作和可能值定义的那样)
这就是为什么 ADT 早于 OOP 语言中出现的类和对象概念。它们之前就存在了。像 class 这样的语句只是在语言中引入了直接支持,允许编译器检查您正在使用 ADT 做什么。
基本类型只是可以存储在内存中的值,没有任何其他关联的代码。他们不了解自己或他们的运作。与 ADT 不同,它们的内部表示为外部参与者所知。就像可能的操作一样。这些都是从外部对价值观进行的操纵。
原始类型带有与 CPU 或虚拟机架构相关的实现细节(尽管您不必看到它)。因为它们映射到 CPU 可用寄存器大小和 CPU 直接执行的指令。例如,因此最大整数值受到限制。
如果允许我这么说,硬件就知道你的原始类型。
因此,如果非抽象数据类型本身也不是 ADT,那么它们就是语言的原始类型。如果它们碰巧是ADT,你可能必须创建它们(不仅仅是声明它们;会有代码在内存中设置东西,而不仅仅是某个地址的存储),因此它们有一个身份,并且通常提供方法通过这个身份来调用,也就是说,他们了解自己。
因为在某些语言中,一切都是对象,例如在 Python 中,内置类型(无需定义类即可轻松使用的类型)有时也称为原始类型,尽管根据上述定义根本不是原始类型。
正如 jaco0646 所提到的,OOP 中有更多关于具体/抽象词的内容。
ADT 已经是一个抽象。它代表您可以实例化的相似对象的类别。
但是 ADT 可以更加抽象,如果您声明它而不打算从中实例化对象,则 ADT 会被这样引用(而不是具体数据类型)。通常您这样做是因为其他“具体”ADT(您实例化的)继承自“抽象”ADT。这允许在多个不同的 ADT 之间共享和扩展行为。例如,您可以定义这样的 API,并让一个或多个不同的 ADT 仅通过继承来向其用户提供(并尊重)该 API。
抽象 ADT 可能由您定义,也可能在语言类型或库中提供。
例如,Python 内置list对象也是一个collections.abc.Iterable.
在 Python 中,您可以使用多重继承来添加类似的功能。虽然还有其他方法。
在Java中你不能,但是你有接口,并且可以声明一个class来实现一个或多个接口,除了可能扩展另一个类之外。
因此,一个目的是直接实例化的 ADT 定义是一个具体的 ADT。否则就是抽象的。
一个密切相关的概念是类中的抽象方法。这是一个不需要用代码填充的方法,因为它应该由应该实现它的子类来填充,并尊重其签名(名称和参数)。
因此,根据您的语言,您会发现实现此概念的可能不同(或类似)方法。