在UML中的一些派生类之间共享方法

时间:2015-09-03 15:19:23

标签: java uml class-diagram

我正在努力为特定场景建模。让我们说我们有一个超类和三个子类。

子类共享超类中的方法列表。但是,有一种方法需要由三个类中的两个共享。所以,我想到了两个场景:

  1. 在两个子类中添加方法。如果我这样做,我会有代码重复,因为该方法的实现是相同的。

  2. 将方法保留在超类中以避免基于上面的方案1的代码冗余。但是,不允许第三类继承该方法吗?这打败了目的。

  3. 那么,关于如何建模这种情景的任何想法?

3 个答案:

答案 0 :(得分: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类都继承method1method2,而method3仅由Derived2Derived3继承。< / p>

注意:我在中间abstract创建类的原因是要强调它是要继承的,并且不能单独使用。没有必要添加任何抽象方法。

  

评论:如果我们需要创建一个非树的共享图,该怎么办?

在这种情况下,您需要多个继承来实现,这在Java中是不可用的。但是,可以使用多个接口继承,这将允许您仅在必须具有它们的类中声明所需的方法。现在您可以将实现卸载到package-private类中,或者将默认实现放入接口中,具体取决于方法的性质:

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);
    }
}

答案 1 :(得分:0)

使用纯UML,您可以一次从多个类继承。 也就是说,您可以建模包含该方法的第二个超类,只有两个子类可以继承(除了公共超类)。

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

当用不允许这样的语言实现你的图表时会出现问题,例如Java(你必须选择两种解决方案中的任何一种。但对于第一种解决方案,你也可以添加一个接口,这样至少方法在中央地方宣布)。但在那之前,从概念上讲,你很好:)

答案 2 :(得分:0)

这就是我想出的: enter image description here

只需从"id"创建一个子类,然后添加两个类所需的方法。