【问题标题】:Inheritance vs Interfacing in OOP designOOP 设计中的继承与接口
【发布时间】:2021-12-04 17:29:19
【问题描述】:

注意:这个问题是关于通用 OOP 设计,而不是特定语言。包含的所有代码都是 python、C++ 和 Java 的伪代码组合,旨在清晰易读,但不一定完美。

OOP 设计的中心原则之一是为接口编码,而不是为实现编码。我们有一个有用的技巧是从其他地方将合约导入到我们的对象中。因此,List 对象可以实现 Prototype 合约和 Iterator 合约(使用 GoF 设计模式术语),还可以实现自己的方法。这让我们可以做类似的事情

Prototype objects[] = {List, Integer, Image}
Prototype other_objects[]
for item in objects:
    Append item.Clone() to other_objects

并使用运行时调度来确定调用了哪个 Clone 方法。

在多重继承语言(例如 C++)中,我们只需继承其中的每一个:

List inherits Prototype, Iterator {
    ...
    //overriding Prototype
    Clone() {...}
    ...
    //Overriding Iterator
    First() {...}
    Next() {...}
    IsDone() {...}
    CurrentItem() {...}
    ...
}

这里我们不关心 Prototype 和 Inheritance 是纯接口还是抽象类,因为我们使用的是真正的继承。

对于单继承语言多接口语言(如java)我们不得不说我们的对象是一种特定类型的对象,然后我们可以给它接口。我们仍然可以使用分派,因为编译器知道对象使用特定的合约。

List(AbstractList) implements Prototype, Iterator {
    ...
    //implementing Prototype
    Clone() {...}
    ...
    //implementing Iterator
    First() {...}
    Next() {...}
    IsDone() {...}
    CurrentItem() {...}
    ...
}

在当今和整个历史中,OOP 中存在/常见的其他接口选项有哪些?例如,如果一种语言没有多重继承,我们也无法实现接口,那么存在哪些技术?

【问题讨论】:

    标签: oop


    【解决方案1】:

    注意:答案改编自 Züllighoven 的面向对象的构建手册

    单继承无接口类具有此属性的一种可能方式是使用 GoF 的适配器设计模式。

    这个模式的意思是,如果我们有一些具有特定接口的对象myObject 和一些无法理解该接口的类Client,则在中间创建一个可以在它们之间转换的对象。

    然后对于我们拥有的每个适配器,通过引用传递给它一个对象,它可以保留一个它需要适应的对象的句柄。通过这种方式,客户端可以像操作底层对象一样操作 Adapter 对象,而不用关心它不是。

    【讨论】:

      猜你喜欢
      • 2015-10-12
      • 1970-01-01
      • 1970-01-01
      • 2010-09-15
      • 2013-02-19
      • 2015-10-29
      • 1970-01-01
      • 2019-09-29
      • 2021-06-25
      相关资源
      最近更新 更多