Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java继承:类的扩展是否应该继承该类?_Java_Design Patterns_Inheritance_Subclass_Extends - Fatal编程技术网

Java继承:类的扩展是否应该继承该类?

Java继承:类的扩展是否应该继承该类?,java,design-patterns,inheritance,subclass,extends,Java,Design Patterns,Inheritance,Subclass,Extends,对于我当前的项目,我正在为java文件类制作一个包装器,以及为路径字符串制作一个包装器(即C:\Users\Public\)。 让我们调用文件类的包装器文件包装器和路径的包装器路径包装器 FileWrapper显然必须有一个路径:磁盘上FileWrapper的文件的位置。现在我的问题是。。。 FileWrapper应该包含类型为PathWrapper的字段(以及PathWrapper的PathWrapper.getPath()的访问器方法),还是应该扩展PathWrapper,从而继承getPa

对于我当前的项目,我正在为java
文件
类制作一个包装器,以及为路径
字符串
制作一个包装器(即
C:\Users\Public\
)。 让我们调用
文件
类的包装器
文件包装器
和路径的包装器
路径包装器

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

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

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

我遇到的问题是,
FileWrapper
,严格来说,它不是一个
路径
。这只是一个文件

这是您需要考虑的唯一问题:一旦您在逻辑上说
文件包装器
不是
路径
,您就应该从选择列表中排除继承

这并不是说你不应该给
FileWrapper
一个
getPath
方法,但是:如果你发现在
FileWrapper
类上有
getPath
更方便,那么添加这个方法是非常有意义的

我想创建一个
FileWrapper
PathWrapper
都将实现的“Path”接口,以便允许
FileWrappers
PathWrappers
的通用列表


听起来是个好主意。接口是一个很好的、轻量级的替代子类化的方法,它在您的情况下更有意义。正确命名,这样的接口将为您的整个系统增加清晰度,而不会增加与可疑继承相关的混淆。

面向对象设计规则:支持组合而不是继承,因为组合(具有-a关系)允许您的代码具有更大的灵活性

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

如果要将它们绑定在一起,可以将
PathWrapper
传递给
FileWrapper
的构造函数

例如,如果您想在集合中同时获取这两种方法,可以创建一个包装器接口,其中
FileWrapper
PathWrapper
是此层次结构中的同级,并共享可由它们各自实现的通用抽象方法


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

java.io.File
是否已经有了获取路径和/或绝对路径的方法?如果您的
FileWrapper.class
文件的包装器,那么只需本机调用该方法即可。。。否?FileWrapper.getPath()将返回一个PathWrapper实例,该实例包含奇特的方法,例如用于检查给定的PathWrapper是否位于另一个PathWrapper定义的文件夹中。反之亦然
。如果您想要的行为比您对该行为的实现更具体或更为人所知,或者如果您可以预期实现的多种风格,那么在数据中没有紧密、定义明确的“是”关系的情况下,基于接口的类型系统是一种选择。如果没有对期望的行为进行这样的关注,那么正确的方法是conposition(这是包装器在任何情况下所暗示的)。我知道,传统上,我们会进行这种区分。然而,在这种情况下,创建一个只有一行的路径接口似乎很混乱。@kryo您可能想给
Path
接口一个不同的名称,比如说,
PathSource
或类似的名称,表明对象有一个路径(因此,允许您调用
getPath()
)而不是路径本身。是的,路径不是一个很好的名字,我只是还没有想出一个非常描述性的名字在这个时候。