3

对于我当前的项目,我正在为 javaFile类制作一个包装器,以及一个路径的包装器String(即。C:\Users\Public\)。让我们调用FileFileWrapper的包装器和路径的包装器PathWrapper

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

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

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

4

2 回答 2

4

OO 设计规则:优先组合而不是继承,因为组合(Has-a 关系)为您的代码提供更大的灵活性

也正如你所说,FileWrapper不是一个PathWrapper,你回答了你的问题。

您想将它们绑定在一起,可以将 a 传递PathWrapperFileWrapper.

例如,如果您想在Collection中获取两者,您可以创建一个Wrapper接口,其中FileWrapperPathWrapper是此层次结构中的兄弟,并共享可以由它们中的每个不同实现的通用抽象方法。

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

于 2013-09-20T23:40:40.837 回答
2

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

这是您需要的唯一考虑因素:一旦您说逻辑上 aFileWrapper不是a ,您应该Path从您的选择列表中排除继承。

但是,这并不是说您不应该提供FileWrapper方法:如果您发现在类上使用 rightgetPath更方便,那么添加该方法是非常有意义的。getPathFileWrapper

我想创建一个“路径”接口,FileWrapper并且PathWrapper都将实现,以允许两者的通用列表FileWrappersPathWrappers.

那听起来像一个好主意。接口是子类化的一种不错的轻量级替代方案,在您的情况下更有意义。如果命名得当,这样的接口将为您的整个系统增加清晰度,而不会增加与可疑继承相关的混乱。

于 2013-09-20T22:38:05.947 回答