如何强制实现类继承一个或另一个子类?

时间:2011-03-17 15:59:52

标签: java class inheritance

我有一个抽象类MotherClass和两个扩展ChildClass1的抽象类ChildClass2MotherClass

我希望确保任何扩展MotherClass的课程实际上都会扩展ChildClass1ChildClass2。我认为基于树的课堂设计出了问题。你知道如何正确地做到这一点吗?

3 个答案:

答案 0 :(得分:3)

如果MotherClass具有包可见性且ChildClass1ChildClass2是公共的并且位于同一个包中,则可以将这两个子类化为子类,而不是母类。

编辑:

另一种可能性:

interface Marker {} //note that this is package private

public abstract class Mother<T extends Marker > {}

public class ChildA extends Mother<ChildA> implements Marker {}

public class ChildB extends Mother<ChildB> implements Marker {}

方法:

doSomething(Mother<?> mother() {}

你现在无法做到

class GrandChild extends Mother<GrandChild> {}

这会编译,但至少会给你一个警告:

class GrandChild extends Mother {} //warning like "Mother is a raw type"

没有警告的方式:

class GrandChild extends ChildA {} 
class GrandChild extends ChildB {} 

答案 1 :(得分:2)

将它放在MotherClass

的构造函数中
protected MotherClass() {
  if (!(this instanceof ChildClass1 || this instanceof ChildClass2)) {
    throw new IllegalStateException("Oh noes!");
  }
}

这个(难以置信的丑陋)解决方案的灵感来自SWT,它在Widget类中有这样的代码:

protected void checkSubclass () {
    if (!isValidSubclass ()) error (SWT.ERROR_INVALID_SUBCLASS);
}

checkSubclassWidget的唯一构造函数中被调用。

这样做是为了避免继承SWT窗口小部件类(因为它不受支持且不应该完成)。请注意,checkSubsclass() 不是 final。因此,如果您真的想要扩展Button(并准备好承担后果),您可以将checkSubclass()覆盖为无操作方法。

答案 2 :(得分:1)

ChildClass1ChildClass2中提取常用功能,并将其移至MotherClass或从MotherClass派生的其他一些抽象类。