对于我当前的项目,我正在为 java File
类制作包装器,以及为路径 String
(即 C :\用户\公共(public)\
)。
让我们调用 File
类的包装器 FileWrapper
和路径的包装器 PathWrapper
。
FileWrapper
显然必须有一个路径:FileWrapper
的 File
在磁盘上的位置。现在我的问题是...
FileWrapper
是否应该包含 PathWrapper
类型的字段(以及 PathWrapper
的 PathWrapper.getPath()
的访问器方法) ), 还是应该扩展 PathWrapper
,从而继承 getPath()
方法?
我遇到的问题是 FileWrapper
,严格来说,不是 Path
。这只是一个文件。但在这种情况下,无论如何只使用继承似乎更简单。
我考虑的第二个解决方案存在另一个问题(在 FileWrapper
中创建一个 getPath()
方法)。我想创建一个 Path
接口(interface),FileWrapper
和 PathWrapper
都会实现,以便允许 FileWrapper< 的通用列表
和 PathWrapper
。
如果 FileWrapper
是 PathWrapper
的子类,则不需要此接口(interface)。
最佳答案
OO 设计规则:优先使用组合而不是继承,因为组合(Has-a 关系)可以让您的代码更加灵活
另外,正如您所说,FileWrapper
不是 PathWrapper
,您回答了您的问题。
你想把它们绑定(bind)在一起,你可以传递一个PathWrapper
给FileWrapper
的构造函数。
例如,如果你想在一个Collection中获取两者,你可以制作一个Wrapper接口(interface),其中FileWrapper
和 PathWrapper
是该层次结构中的 sibling ,并且共享可以由它们各自以不同方式实现的公共(public)抽象方法。
很多设计模式都可以应用到这个例子中,你需要做的就是先决定你想要什么。
关于Java 继承 : should an extension of a class inherit the class?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18926818/