2014-07-18 46 views
0

主要目的是爲了避免與現有的東西,最好的繼承模型領域的重複:什麼是給定的例子最好的繼承模型

我有下面的類層次結構:

class A 
{ 
private String fieldA1; 
private String fieldA2 

// getters and setters 

} 

Class B extends A 
{ 
private String fieldB1; 
private String fieldB2; 

// getters and setters 
} 

「用戶」類將擴展A或B並擁有自己的字段。

假設現有API在數據模型上面的使用。 現在需要在A類中爲新的API集添加新字段。 我有一定的限制,不要修改現有的數據模型,因爲它暴露或破壞現有的API與這些新的領域。因此,需要通過擴展現有數據模型來創建新的數據模型,以便新的API將其與所有現有字段+新字段一起使用。我有下面的解決方案,這可能不是最好的方法,因爲它增加了字段的重複。

class A 
    { 
    private String fieldA1; 
    private String fieldA2 

    // getters and setters 
    } 

    Class B extends A implements Common 
    { 
    private String fieldB1; 
    private String fieldB2; 


    // getters and setters 
    } 


    Class NewA extends A 
    { 
    private String fieldNewA; 

    // getters and setters 
    } 

    Class NewB extends NewA implements Common 
    { 
    private String fieldB1; 
    private String fieldB2; 

    private String fieldNewB; 

    // getters and setters 

    } 

    Interface Common 
    { 
    //marker interface 
    } 

請建議是否有更好的方法。

謝謝...

+0

小調:'私人領域'不會被繼承。現在,我假設你會創建getter和setter,但考慮讓它們成爲'protected'。 – user949300

+0

是的,有getter和setter。更新了問題。 – user2523794

回答

3

我認爲你需要後退一步,看看它是什麼,是造成你隨時添加新字段到現有的類。也許你應該只有一個領域是財產和價值的集合。這樣,任何新的字段將只是您集合中的另一個屬性/值。您不必擔心經常添加新字段。

+0

添加新字段將如何打破liskov替換原則?在這個例子中,如果它的派生類只是添加新的字段,並且基類的字段/方法保持不變,那麼「A」的現有行爲仍然保持不變。 – user2523794

+0

你說得對。我的錯。我會刪除我的建議。 –

0

你的例子並不是很好,例如子類不能訪問私有字段,但你不清楚你想要你的子類實現什麼。

如果你希望繼承狀態,你的例子應該使用protected或public字段,或者顯示繼承的getter和setter方法。當繼承狀態時,像Common一樣實現一個接口是多餘的。更多細節可能有助於澄清你的意圖。

除此之外,是的,您可以按照您的描述擴展數據模型,以便將數據類型添加到現有類。想要這樣做的例子可能希望從Triangle類創建Square類,需要添加一個新點。並且還需要改變行爲以利用新領域。

+0

抱歉失蹤的獲得者和制定者。我已經更新了這個問題。所以你的意思是我提到的解決方案是正確的? – user2523794

+0

是的。還有其他方法可以實現它,但如果您希望使用Java的單一繼承,則可以採用這種方式,從而爲您提供類型兼容性和代碼重用。其他語言可以說更容易,因爲它們允許混入和多重繼承。但這是另一個問題的主題,涉及到其他的折衷。 –

相關問題