我有一个源自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
答案 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来实现这一点,而这就像多态性正好相反。 :)