为什么类继承和接口实现会涉及到对象?

问题描述 投票:0回答:1

了解班级之间的差异也很重要 继承和接口继承(或子类型)。班级 继承根据另一个对象的实现来定义 对象的实现。简而言之,它是一种代码和机制 代表共享。相反,接口继承(或 子类型)描述了何时可以使用对象来代替 另一个。
---《设计模式:可重用的面向对象的要素 软件第一版》

  1. 继承,不就是子类“继承”父类的属性和方法吗? 它如何变成“一个对象的实现取决于另一个对象的实现”? 当我在代码中实现从类 A 继承的类 B 时,我根本没有实例化任何对象!

  2. 接口不就是一种特殊的抽象类吗? (与抽象类相比,接口只声明方法,不声明属性或字段。)当具体类实现接口时,它不就是一个继承“接口”并实现接口中声明的方法的类吗? 这如何变成“一个对象可以代替另一个对象”? 当我在代码中让类 B 实现接口 A 时,我根本没有实例化任何对象!

class object oop design-patterns interface
1个回答
0
投票

术语往往会随着时间的推移而演变;如今,当你听到“接口”时,就会想到 Java、C++ 和 Go 等语言的

interface
特性,但当 1994 年 设计模式 出现时,这些语言都还不存在。所以当它谈到“接口继承”时,它所指的并不是这个。

“接口”指的是类公开的方法集;因此,例如,我们可能会谈论 Java 的 java.util.ArrayList 类“实现”的“接口”,这将是其各种方法的名称、签名和(可以说)契约,包括例如它的“ensureCapacity”方法(即使该方法没有由 ArrayList“实现”的任何“接口”指定)。

在Java这样的语言中,all继承是“接口继承”;如果类 A 扩展了类 B,那么它会自动实现类 B 的接口。(嗯,有一些边界情况 - 例如,java.sql.Timestamp 的 Javadoc 表示虽然它扩展了 java.util.Date,我们应该假装它没有,因为它作为 java.util.Date 的行为并不是 100% 正确 — 但至少就 Java 语言本身而言,所有继承都是接口继承,并且某些类只是存在错误. ;-)   ) 但某些语言并非如此;例如,C++让A类以“私有”方式继承B类,其中A类拥有B类的所有方法,但它们都是private

,因此客户端无法调用它们。在这种继承中,
implementation被继承,但interface不是。这就是为什么设计模式做出这种区分。

© www.soinside.com 2019 - 2024. All rights reserved.