Java继承:类的扩展是否应该继承该类?
对于我当前的项目,我正在为javaJava继承:类的扩展是否应该继承该类?,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
文件
类制作一个包装器,以及为路径字符串
制作一个包装器(即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()
)而不是路径本身。是的,路径不是一个很好的名字,我只是还没有想出一个非常描述性的名字在这个时候。