4

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

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

类:帐户;方法:A、B、C、G、H、I、S1、S2、S3
类:文件夹;方法: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

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

目前我的设计很丑:

interface Object1:声明A、B、C
interface Object2 extends Object1:声明D、E
interface Object3 extends Object2:声明F
interface Account extends Object1:声明G、H、I
interface Folder extends Object2;
接口组扩展 Object3;
接口角色扩展了 Object3;
类助手:定义 S1、S2、S3

我知道禁止多重继承是有充分理由的,但如果我被允许这样做,我可以将方法 S1、S2 和 S3 放入 Object1 并将所有接口转换为抽象。然后 FooAccount 可以扩展 Account 和 FooObject1。

谁能给我一些建议,什么结构可能更好?我是否应该将所有 A、B、C 等放入 Util 类(例如 FooUtil 和 BarUtil)?

4

2 回答 2

2

您应该根据角色而不是发生来对接口中的方法进行分组。所以假设A, B,C属于一个角色,D并且E属于另一个角色并且属于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

如果您可以提取 and 的共同行为,您也可以考虑使用泛型FooBar并且已经Account是泛型类(采用Fooand Bar)而不是接口

于 2012-06-19T17:27:02.110 回答
0

不要依赖继承作为减少重复代码的机制。相反,想办法将职责分离到单独的类中。

FooAccount 和 FooGroup 具有相同的方法 A

这告诉我方法 A 的实现属于它自己的类 ( FooA)。Account如果对andGroup暴露方法真的有意义,那么andA的实现应该简单地传递给.FooAccount.AFooGroup.AFooA.A

于 2012-06-19T17:32:27.347 回答