我正在努力为特定场景建模。让我们说我们有一个超类和三个子类。
子类共享超类中的方法列表。但是,有一种方法需要由三个类中的两个共享。所以,我想到了两个场景:
在两个子类中添加方法。如果我这样做,我会有代码重复,因为该方法的实现是相同的。
将方法保留在超类中以避免基于上面的方案1的代码冗余。但是,不允许第三类继承该方法吗?这打败了目的。
那么,关于如何建模这种情景的任何想法?
答案 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
类都继承method1
和method2
,而method3
仅由Derived2
和Derived3
继承。< / 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)