【问题标题】:Overlapping inheritance in JavaJava中的重叠继承
【发布时间】:2010-09-27 15:38:06
【问题描述】:

我有一个重叠的继承层次结构。系统了解可以是客户、提供者和代理的人员。一个人必须属于这些类之一,但可以属于两个或三个,即一个人可以同时是客户和提供者。

在数据库中我认为问题解决了,每个类(Person、Client、Provider 和 Agent 表)一个表和一个从子类表的主键到超类表的主键的外键。 (欢迎任何可能的改进:))

问题出现在 Java 世界中,我不知道将此数据库设计映射到我的 Java POJO 的最佳方式。我有三种可能的解决方法:

  • 一个名为 Person 的唯一类,其中包含子类中所有字段的联合。这将需要一个鉴别器字段才能知道 Person 的种类。问题是一个不是客户端而是提供者的人,会将所有与客户端相关的字段设置为空。

  • 一个名为 Person 的唯一类,具有子类的所有公共字段和三个“DTO 类”属性,其中包含与每个子类相关的字段。这样我们只有一两个字段为空而不是几十个

  • Person 的一个抽象类和七个子类,三个子类的可能组合各一个,即 Client、Provider、Agent、ClientProvider、ClientAgent ... ClientProviderAgent。 :S(当然每个人都有对应的接口)

这是一个网络应用程序。我在 UI 上使用 hibernate + spring 和 GWT

问题是:解决这个问题的最佳方法是什么?

【问题讨论】:

  • 客户、提供者和代理有什么共同点?他们有什么不同?
  • 他们有共同的名字、地址等。客户有订单、折扣、收费数据。供应商有付款天数、产品等等......

标签: java inheritance multiple-inheritance overlap


【解决方案1】:

IMO 继承并不是最好的建模方式,我会尝试组合。

您可以有一个 Person 类和多个 Role 类(实现一个通用接口,或者成为 Role 枚举的成员,具体取决于上下文),每个人都附加一个或多个 Role。

通过这种方式,您可以轻松添加新的角色类型,并动态地将角色附加到一个人/从一个人分离角色。 (如果需要,你也可以让没有角色的人。)

粗略的例子:

interface Role {
  ...
}

final class Client implements Role {
  ...
}

final class Provider implements Role {
  ...
}

final class Agent implements Role {
  ...
}

class Person {
  List<Role> roles;
  public void addRole(Role role) { ... }
  public void removeRole(Role role) { ... }
  public Role getRoleOfType(Class<? extends Role> roleType) { ... }
}

更新:基于枚举的示例

这适用于角色对象没有状态的情况,因此您将相同的角色实例附加到每个人。

enum Role {
  CLIENT,
  PROVIDER,
  AGENT;
  // possible members, constructor etc.
}

Person 类与上面几乎相同,除了

  • 我使用EnumSet 而不是List,因为这是专门为枚举量身定制的,
  • getRoleOfType() 在这里没有意义,所以我将其替换为hasRole()

    class Person {
      Set<Role> roles = new EnumSet<Role>();
      public void addRole(Role role) { ... }
      public void removeRole(Role role) { ... }
      public boolean hasRole(Role role) { ... }
    }
    

【讨论】:

  • 请您说得更准确些好吗?谢谢
  • 感谢您的编辑 :) 再想一想:您能否解释一下“成为角色枚举的成员”是什么意思。再次感谢你,很抱歉这么无聊:S
  • @xocobola,没问题,看看我的更新 :-) 你也可以看看Java Tutorial section on enums
  • Thaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 非常感谢你!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-16
  • 2015-12-25
  • 2015-11-11
  • 1970-01-01
  • 2020-04-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多