2011-10-17 41 views
0

我有一個源於Hibernate模型的通用OO設計問題。具有子類唯一性和多態的Java引用類型

付款 - 庫(超型)

@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不是問題(每CLAS表等級)。由於Hibernate能夠接受通用對象實例並仍然保留正確的實例。

我的問題是圍繞在代碼的其他部分polymorhically使用付款。由於每個子類都添加了唯一的實例字段,這意味着我需要在Payment上存儲這些子類字段,以便購買多態的好處。這似乎並不正確,因爲每次我向子類添加新字段或新增付款類型時,我都會回過頭來將metohods添加到付款中。

是否有我缺少的東西,我可以使用的Java固有的模式或特性?

感謝

-J

回答

1

單純從OO POV(觀點),你應該試圖提取界面信用卡式或現金交易類型。因此,理想情況下,如果不能爲子類Y實現它(或者更好地說至少一個其他子類),則不應該有子類X的變量的訪問器。

E.g.在這種情況下,我會說你可以有這樣的方法Payment

String getPaymentType(); 
double getPaymentAmount(); 

這是由所有子類實現的。 不同

然後你會得到真正的多態性。

如果您必須訪問特定的東西,比如說說紙或硬幣「在代碼的其他部分」,那麼代碼的這些部分應該是import Cash而不是Payment。這是因爲這段代碼特定於Cash交易,並且與CreditCard沒有關係,因此在Payment中沒有提取某些特定方法的意義。 PS:你說「...因爲Hibernate能夠接受通用對象實例,並且仍然保留正確的實例。」 ==>這當然不是多態。我什麼都不喜歡Hibernate,但我猜測它會使用RTTI來實現這一點,這就像多態的完全相反。 :)

+0

謝謝,我明天會修補這個。我也想知道是否需要現在更改我的Hibernate映射。如果我找不到一個簡單的解決方案,我可能會把它扔到休眠板上。再次感謝。 – user943583