Java设计帮助。继承和共享代码

时间:2012-06-19 17:21:57

标签: java oop

我在编程开发方面仍然是一个noobie,并且在制作干净的设计时遇到了一些麻烦。具体来说,我有一个场景如下:

我有4个类,每个类都有共同的功能。让我们称这些方法为A,B,C等。

课程:帐户;方法:A,B,C,G,H,I,S1,S2,S3
class:文件夹;方法:A,B,C,D,E,S1,S2,S3
类:组;方法:A,B,C,D,E,F,S1,S2,S3
类:角色;方法:A,B,C,D,E,F,S1,S2,S3

上面指出的方法是抽象的。因为可能存在以不同方式实现方法A的FooAccount和BarAccount。然而,FooAccount和FooGroup具有相同的方法A(因为它们具有相同的实现; Foo)。还不错,除了还有一些方法S1,S2和S3甚至在Foo和Bar之间实现相同,因此FooAccount和BarAccount具有相同的方法S1,S2和S3。

目前我的设计非常难看:

interface Object1:声明A,B,C
接口Object2扩展Object1:声明D,E
接口Object3扩展Object2:声明F
接口帐户扩展Object1:声明G,H,I
interface文件夹扩展Object2;
接口组扩展了Object3;
interface Role extends Object3;
类助手:定义S1,S2,S3

我知道有多种遗传是有充分理由的,但如果我被允许这样做,我可以将方法S1,S2和S3放入Object1并将所有接口转换为摘要。然后FooAccount可以扩展Account和FooObject1。

任何人都可以给我一些建议可能会更好吗?我应该把所有A,B,C等放入Util类(例如FooUtil和BarUtil)吗?

2 个答案:

答案 0 :(得分:2)

您应该根据角色对接口中的方法进行分组,而不是出现。因此,假设ABC属于一个角色,DE属于另一个角色,F属于自己的角色

interface Role1 - A, B, C
interface Role2 - D, E
interface Role3 - F
interface Account extends Role1
interface Folder extends Role1, Role2
interface Group extends Role1, Role2, Role3

如果您有通用的方法实现,可以将它们移动到提供默认实现的抽象基类

abstract class Helper - S1, S2, S3

然后你可以声明你的具体类

class FooAccount extends Helper implements Account

如果您可以提取FooBar的共同行为并将Account设为通用类(考虑FooBar,您也可以考虑使用泛型})而不是接口

答案 1 :(得分:0)

不要依赖继承作为减少重复代码的机制。相反,找出一种将责任分成不同类的方法。

  

FooAccount和FooGroup具有相同的方法A

这告诉我方法A的实现属于它自己的类(FooA)。如果AccountGroup公开方法A真的有意义,那么FooAccount.AFooGroup.A的实现应该只是传递给{FooA.A 1}}。

相关问题