Java 继承 : should an extension of a class inherit the class?

标签 java design-patterns inheritance subclass extends

对于我当前的项目,我正在为 java File 类制作包装器,以及为路径 String(即 C :\用户\公共(public)\)。 让我们调用 File 类的包装器 FileWrapper 和路径的包装器 PathWrapper

FileWrapper 显然必须有一个路径:FileWrapperFile 在磁盘上的位置。现在我的问题是... FileWrapper 是否应该包含 PathWrapper 类型的字段(以及 PathWrapperPathWrapper.getPath() 的访问器方法) ), 还是应该扩展 PathWrapper,从而继承 getPath() 方法?

我遇到的问题是 FileWrapper,严格来说,不是 Path。这只是一个文件。但在这种情况下,无论如何只使用继承似乎更简单。

我考虑的第二个解决方案存在另一个问题(在 FileWrapper 中创建一个 getPath() 方法)。我想创建一个 Path 接口(interface),FileWrapperPathWrapper 都会实现,以便允许 FileWrapper< 的通用列表PathWrapper。 如果 FileWrapperPathWrapper 的子类,则不需要此接口(interface)。

最佳答案

OO 设计规则:优先使用组合而不是继承,因为组合(Has-a 关系)可以让您的代码更加灵活

另外,正如您所说,FileWrapper 不是 PathWrapper,您回答了您的问题。

你想把它们绑定(bind)在一起,你可以传递一个PathWrapperFileWrapper的构造函数。

例如,如果你想在一个Collection中获取两者,你可以制作一个Wrapper接口(interface),其中FileWrapper PathWrapper 是该层次结构中的 sibling ,并且共享可以由它们各自以不同方式实现的公共(public)抽象方法。

很多设计模式都可以应用到这个例子中,你需要做的就是先决定你想要什么。

关于Java 继承 : should an extension of a class inherit the class?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18926818/

相关文章:

Django 自动从抽象元类继承 "abstract = true"

c# - C#中new修饰符的真正意义是什么

javascript - OOP 继承和对象实例

java - 扫描仪 next() 为某些在线编译器抛出 NoSuchElementException

java - 修改 XML 节点但保持 XML 文件格式不变

java - 使用旧数组的内容创建新数组,同时保持旧数组静态

c - 删除嵌套函数调用中生成的中间指针的最佳做法是什么?

c# - ASP.NET MVC 最佳实践

java - java中的"<<"运算符

design-patterns - Builder 模式是否有特定术语,其中每个方法都返回 `this` ?