2015-09-03 197 views
1

我很努力爲特定的場景建模。假設我們有一個超類和三個子類。在UML中的一些派生類之間共享方法

子類共享超類的方法列表。但是,有一種方法需要由三類中的兩類共享。所以,我想到了兩種情況:

  1. 在兩個子類中添加該方法。如果我這樣做,我會有代碼重複,因爲方法的實施是相同的。

  2. 將方法保留在超類中以避免基於上述方案1的代碼冗餘。但是,不會允許第三個類繼承該方法嗎?這打破了目的。

那麼,有關如何模擬這種情況的任何想法?

+1

不要以你的類有什麼方法來思考。根據什麼是任務/目的來考慮。然後重新考慮繼承是否是一個好的解決方案。 –

+0

正如@JensSchauder所指出的,沒有**有用的**方法來回答這個問題,而不知道真正的類和操作。當然,我們可以考慮許多可能的場景,但沒有關於我們正在討論的課程和操作的知識,就沒有辦法選擇合適的場景。類不僅僅是一些可以繼承的功能。他們應該形成屬於具有明確定義和目的的階級的屬性,關係和行爲的一致的邏輯分組。 –

回答

0

使用純粹的UML,您可以一次繼承多個類。 也就是說,你可以對包含該方法的第二個超類進行建模,從中只有兩個子類可以繼承(除了公共超類)。

參考:http://www.uml-diagrams.org/generalization.html#multiple-inheritance

這在禁止使用這種語言,比如Java(你必須選擇要麼你的兩個解決方案,實現您的圖表時變得有問題,但對於第一個解決方案,你也可以添加。接口,以便至少該方法在中心位置聲明)。但在那之前,在概念層面上,你很好:)

+0

這是一個很好的觀點。我不知道UML允許多重繼承。但是,正如你所提到的那樣,這可能是有問題的。 – bangbang

2

你們兩種情況都不是特別好。繼承進二出的三類一定的方法需要提示你可能丟失,中間是一個抽象類,從兩個類繼承:

public class Top { 
    public void method1() {} 
    public void method2() {} 
} 
public abstract class AbstractTwoAndThree extends Top { 
    public void method3() {} 
} 
public class Derived1 extends Top { 
} 
public class Derived2 extends AbstractTwoAndThree { 
} 
public class Derived3 extends AbstractTwoAndThree { 
} 

這樣一來,所有的三個Derived類繼承method1method2method3僅由Derived2Derived3繼承。

注:我在中間abstract作出的類的原因是要強調的是,它的目的是繼承,且不得單獨使用。沒有必要添加任何抽象方法。

評論:如果我們需要創建一個不是樹的共享圖?

在這種情況下,您需要實現的多重繼承,這在Java中不可用。但是,可以使用接口的多重繼承,這將允許您只在必須擁有它們的類中聲明所需的方法。現在,您可以卸載實現成包私有類,或把默認實現進入界面,這取決於方法的性質:

public class Top { 
    public void method1() {} 
    public void method2() {} 
} 
public interface TwoAndThree { 
    void method3() {} 
} 
public class Derived1 extends Top { 
} 
class TwoAndThreeHelper { // The class is not public 
    public static void method3impl(TwoAndThree inst) { 
     ... // Implement the method 
    } 
} 
public class Derived2 extends Top implements TwoAndThree { 
    public void method3() { 
     // Call the shared implementation to avoid duplicating code 
     TwoAndThreeHelper.method3impl(this); 
    } 
} 
public class Derived3 extends Top implements TwoAndThree { 
    public void method3() { 
     // Call the shared implementation to avoid duplicating code 
     TwoAndThreeHelper.method3impl(this); 
    } 
} 
+0

這是一個非常好的設計。如果我添加另一個名爲class4的類,並假設claase 1,2和3需要method3而不是4,並且僅需要兩個和三個名爲method4的新方法。我們將如何建模?我們不能創建兩個抽象類(一個用於method3,另一個用於method4),因爲我們不能繼承兩個類。 – bangbang

0

這是會來什麼我趕上了: enter image description here

只需從Main創建一個子類並添加兩個類所需的方法。

相關問題