我在编程开发方面仍然是一个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)吗?
答案 0 :(得分:2)
您应该根据角色对接口中的方法进行分组,而不是出现。因此,假设A
,B
,C
属于一个角色,D
和E
属于另一个角色,F
属于自己的角色{ p>
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
如果您可以提取Foo
和Bar
的共同行为并将Account
设为通用类(考虑Foo
和Bar
,您也可以考虑使用泛型})而不是接口
答案 1 :(得分:0)
不要依赖继承作为减少重复代码的机制。相反,找出一种将责任分成不同类的方法。
FooAccount和FooGroup具有相同的方法A
这告诉我方法A的实现属于它自己的类(FooA
)。如果Account
和Group
公开方法A
真的有意义,那么FooAccount.A
和FooGroup.A
的实现应该只是传递给{FooA.A
1}}。