具有子类唯一性和多态性的Java引用类型

时间:2011-10-17 16:35:01

标签: java hibernate oop polymorphism

我有一个源自Hibernate模型的一般OO设计问题。

实施例

付款 - 基础(超级型)

@Entity
@Table(name = "PAYMENT")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn( name = "type", discriminatorType = DiscriminatorType.STRING)
@DiscriminatorValue("BASE")

public class Payment{

 private Product product;
 private Date date;
 private Customer Customer;
 getters/setters
}

信用卡式

@Entity
@DiscriminatorValue("CC")
public class CreditCard extends Payment {
  private String Account
  getters/setters
}

现金

 @DiscriminatorValue("CASH")
public class Cash extends Payment {

  private String Paper
  private String Coins
  getters/setters

}

使用hibernate不是问题(每个类层次结构的表)。由于Hibernate能够接受通用的Object实例并仍然保持正确的实例。

我的问题集中在代码的其他部分以多态方式处理付款。由于每个子类都添加了唯一的实例字段,这意味着我需要在Payment本身上删除这些子类字段,只是为了购买多态性的好处。这似乎是不正确的,因为每次我向子类或新类型的付款添加新字段时我都会返回并将metohod添加到付款。

我有什么遗漏的东西,我可以使用的Java固有的模式或东西吗?

由于

-J

1 个答案:

答案 0 :(得分:1)

纯粹来自OO pov(观点),您应该尝试提取CreditCard或Cash类型的交易的接口。理想情况下,如果你不能为子类Y实现它(或者更好地说至少一个其他子类),你不应该有任何子类X变量的访问器。

E.g。在这种情况下,我会说你可以在Payment中使用这些方法:

String getPaymentType();
double getPaymentAmount();

由所有子类实现。的以不同的

然后你会得到真正的多态性。

如果您必须在代码的其他部分访问特定内容,如“纸张或硬币”,那么代码的这些部分应该import Cash而不是Payment。这是因为该段代码特定于Cash个事务而与CreditCard无关,因此在Payment中提取某些特定方法毫无意义。

PS:你说过“......因为Hibernate能够接受一个通用的Object实例并且仍然保持正确的实例。” ==>这当然不是多态性。我不知道任何关于Hibernate的东西,但我猜它会使用RTTI来实现这一点,而这就像多态性正好相反。 :)