我很努力爲特定的場景建模。假設我們有一個超類和三個子類。在UML中的一些派生類之間共享方法
子類共享超類的方法列表。但是,有一種方法需要由三類中的兩類共享。所以,我想到了兩種情況:
在兩個子類中添加該方法。如果我這樣做,我會有代碼重複,因爲方法的實施是相同的。
將方法保留在超類中以避免基於上述方案1的代碼冗餘。但是,不會允許第三個類繼承該方法嗎?這打破了目的。
那麼,有關如何模擬這種情況的任何想法?
我很努力爲特定的場景建模。假設我們有一個超類和三個子類。在UML中的一些派生類之間共享方法
子類共享超類的方法列表。但是,有一種方法需要由三類中的兩類共享。所以,我想到了兩種情況:
在兩個子類中添加該方法。如果我這樣做,我會有代碼重複,因爲方法的實施是相同的。
將方法保留在超類中以避免基於上述方案1的代碼冗餘。但是,不會允許第三個類繼承該方法嗎?這打破了目的。
那麼,有關如何模擬這種情況的任何想法?
使用純粹的UML,您可以一次繼承多個類。 也就是說,你可以對包含該方法的第二個超類進行建模,從中只有兩個子類可以繼承(除了公共超類)。
參考:http://www.uml-diagrams.org/generalization.html#multiple-inheritance
這在禁止使用這種語言,比如Java(你必須選擇要麼你的兩個解決方案,實現您的圖表時變得有問題,但對於第一個解決方案,你也可以添加。接口,以便至少該方法在中心位置聲明)。但在那之前,在概念層面上,你很好:)
這是一個很好的觀點。我不知道UML允許多重繼承。但是,正如你所提到的那樣,這可能是有問題的。 – bangbang
你們兩種情況都不是特別好。繼承進二出的三類一定的方法需要提示你可能丟失,中間是一個抽象類,從兩個類繼承:
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
類繼承method1
和method2
而method3
僅由Derived2
和Derived3
繼承。
注:我在中間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);
}
}
這是一個非常好的設計。如果我添加另一個名爲class4的類,並假設claase 1,2和3需要method3而不是4,並且僅需要兩個和三個名爲method4的新方法。我們將如何建模?我們不能創建兩個抽象類(一個用於method3,另一個用於method4),因爲我們不能繼承兩個類。 – bangbang
不要以你的類有什麼方法來思考。根據什麼是任務/目的來考慮。然後重新考慮繼承是否是一個好的解決方案。 –
正如@JensSchauder所指出的,沒有**有用的**方法來回答這個問題,而不知道真正的類和操作。當然,我們可以考慮許多可能的場景,但沒有關於我們正在討論的課程和操作的知識,就沒有辦法選擇合適的場景。類不僅僅是一些可以繼承的功能。他們應該形成屬於具有明確定義和目的的階級的屬性,關係和行爲的一致的邏輯分組。 –