gpt4 book ai didi

oop - 为什么类的私有(private)部分被视为接口(interface)?

转载 作者:行者123 更新时间:2023-12-04 18:41:40 27 4
gpt4 key购买 nike

我正在阅读 Grady Booch 的书面向对象的分析和设计与应用程序,第三版。在第 94 页,Booch 说:

We can furthur devide the interface of a class into four parts:

  1. Public: a declaration that is accessible to all clients
  2. Protected: a declaration that is accessible only to the class itself and its subclasses
  3. Private: a declaration that is accessible only to the class itself
  4. Package: a declaration that is accessible only by classes in the same package


我可以理解为什么 protected 声明可以被认为是一个接口(interface),因为一个类的子类也是这个类的客户端。

但我不明白为什么 私有(private) 声明可以被认为是接口(interface)。请启发我。

最佳答案

But I don't understand why the private declaration can be considered as interface.



可以说私有(private)声明构成了一个接口(interface),因为它们有自己的客户,尽管没有类的 protected 或公共(public)接口(interface)那么多。

这些客户是:
  • 类(class)本身。 显然,您可以访问您的类(class)的 private来自类的任何实例的任何静态或非静态方法的成员。
  • 您类(class)的内部类(class)。 请记住,您类(class)的内部类可以访问您类(class)的所有成员,包括private。那些。
  • (在 C++ 中)你们类的 friend 。 尽管从您问题中的引用中,我看到您所指的书是关于 Java 的,但为了完整起见,我还是会添加此项目,因为您的问题未标记 java .在 C++ 中有一个 friend关键字,它允许类的程序员将某些其他类和/或函数指定为该类的 friend 。这种“友好”的类和函数可以访问类的所有成员,包括private的,因此它们也是该类的私有(private)接口(interface)的客户端。

  • 因此,拥有一个定义良好的私有(private)接口(interface)可能很有用,因为它使您的类、它的 friend 和内部类中的方法的实现更简单,并且对于可能在您的类上工作的其他开发人员来说更易于管理。

    But still, I find an "interface to itself" is quite odd.



    与自身的接口(interface)可能很重要。这是一个小小的思想实验。

    想象一下,两个开发人员 Alice 和 Bob 正在开发同一个类,称为 MissileLauncher。 . Bob 负责实现在导弹发射后清除发射台的逻辑。 (这是一种私有(private)机制,公共(public)或 protected 接口(interface)的客户端可能不会请求清除填充 - 它只是此类的一个实现细节)。

    所以,Bob 知道要清除发射台必须递减 missleCounter , 设置 currentMisslenull并调用 pendingOperations.remove(this.currentOp) .类的代码中只有一个地方必须这样做。 Bob 可以将所有这些封装在一个私有(private)方法中,称为 clearLaunchingPad()。不过他觉得这逻辑太简单了,也就不理会了。

    几个月后,Alice 发现还有另一种情况,需要清理发射台。如果 Bob 考虑过一个适当的“与自己的接口(interface)”,Alice 将能够简单地编写对 this.clearLaunchingPad() 的调用。并在几秒钟内完成。但是,众所周知,鲍勃没有。现在爱丽丝必须去问鲍勃她需要做什么来清理垫子。但是几个月过去了,Bob 已经不记得实现细节了,或者更糟糕的是,他可能从那时起就被解雇了(考虑到他的编码文化,这也不足为奇)。

    所以现在 Alice 不得不深入研究 MissileLauncher 的代码。并试着弄清楚她需要做什么,希望 Bob 至少有礼貌地评论他的代码。

    这样一来,几秒钟就变成了几个小时,还有一些可能的错误(Alice 可能忘记在最后调用 pendingOperations.remove(this.currentOp)),只是因为 Bob 没有注意这个类的接口(interface)的设计。

    关于oop - 为什么类的私有(private)部分被视为接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38581620/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com