gpt4 book ai didi

oop - 具体实现是否应该提供其实现的接口(interface)中不存在的任何公共(public) API?

转载 作者:行者123 更新时间:2023-12-01 22:53:51 27 4
gpt4 key购买 nike

接口(interface)代码”被认为是良好的实践。此类代码易于进行单元测试并支持松散耦合。用户只知道接口(interface),并且连接具体对象的责任位于最顶层(这可以在某些初始化代码中或在框架的帮助下完成)。

我的问题是关于遵循接口(interface)代码的实践:这是否意味着具体类永远不能声明其接口(interface)中不存在的任何公共(public)方法?

否则,它将迫使用户依赖于具体的实现。这将使此类方法难以进行单元测试;如果测试失败,确定失败是由于调用者代码中的问题还是由于具体方法导致失败将需要额外的努力。这也会打破依赖倒置原则。它将引发类型检查和向下转换,这被认为是不好的做法。

最佳答案

这是完全可以接受的,只要新方法对于类的操作并不重要,特别是当有人将其视为父类(super class)或接口(interface)时,对于类的运行方式并不重要。 p>

ArrayList 提供了很好的例子。它有一些方法可以让您管理其内部内存,例如 ensureCapacity(int)trimToSize() 。如果您知道正在使用 ArrayList 并且需要更精确地分配内存,那么这些有时会很有帮助,但 ArrayList 的基本操作不需要它们,特别是拥有它时不需要它们作为通用列表进行操作。

事实上,接口(interface)本身可以通过这种方式添加新方法。考虑NavigableSet ,它扩展了 Set。它添加了一大堆依赖于集合元素顺序的方法(给我第一个、最后一个、从这里开始的子树等)。这些方法都没有在 Set 上定义,甚至元素是有序的这一事实也不是由 Set 契约定义的;但 Set 方法都可以正常工作,无需额外的方法和排序。

“为接口(interface)编写代码”的建议是一个好的开始,但它有点过于笼统。该建议的改进是“编写您需要的最通用的接口(interface)”。如果您不需要 ArrayLists 的方法(或其契约,例如其随机访问性能),请将代码编写为 List;但如果您确实需要它们,请务必使用它们。

关于oop - 具体实现是否应该提供其实现的接口(interface)中不存在的任何公共(public) API?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36376979/

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