java中的多个子类

时间:2012-10-29 19:14:14

标签: java inheritance

我想知道一些可以限制java中给定类的多个子类的过程。

e.g。如果我有A类,那么只有一个类可以扩展A,即允许不超过1个子类。

我在公司的采访中被问过这个问题,非常感谢你的帮助或指导。

5 个答案:

答案 0 :(得分:3)

您可以通过Sujay链接的机制阻止任何人使用多个子类(请参阅注释)。超类构造函数/方法可以跟踪调用它们的子类,记住第一个,如果使用另一个子类则抛出异常。不是很优雅,可能不是很有用(但这是面试问题)。

更新:这就是你所追求的(来自http://www.drmaciver.com/2007/09/how-to-create-sealed-classes-in-java/)?

public class Sealed
{
    private Sealed() { }

    public final static class Foo extends Sealed {
       public Foo() { }
    } 
}

您无法在Sealed类之外创建更多子类,因为构造函数不可见......

答案 1 :(得分:1)

您无法在编译器级别对此进行限制。您可以“在运行时”对此进行“限制”。创建包含Class子项的静态变量。该变量将由基类的构造函数更新。如果实例化了其他子节点,则构造函数将抛出异常:

class Base {
    private static Class<? extends Base> childClass = null;

    protected Base() {
        if (childClass == null) {
            childClass = this.getClass();
        }
        if (!childClass.equals(this.getClass())) {
            throw new IllegalStateException("More than one child");
        }
    }
}

其他解决方案可能是扫描应用程序类路径并查找扩展Base的所有类。 另一种解决方案是拦截类加载器,以便在运行时捕获加载的类。如果您正在开发独立应用程序或使用检测包(如果您没有直接访问类加载器),则可以以编程方式控制类加载器。

我相信我在这里提到了你的工作人员不知道的技术...... :)

答案 2 :(得分:0)

您可以使用工厂设计模式为类层次结构创建实例,并使用静态计数器表示实例数。如果数量超出您的需要,请在工厂方法上抛出异常

答案 3 :(得分:0)

当您尝试创建使用Factory的子类时,该怎么办?工厂可以保留某种计数器或逻辑来确定是否允许创建类。如果确定无法创建类,则抛出异常。

try {
   ChildClass childClass = ChildFactory.createChild();
} catch (ChildCreateionException e) {
    ...
}


class ChildFactory {

    public static final int MAX_CHILDREN = 2;
    public static int numChildren = 0;

    public ChildClass createChild() throws ChildCreationException {
        if (numChildren < MAX_CHILDREN) {
            numChildren++;
            return new ChildClass();
        }

        throw new ChildCreationException("Exceeded maximum number of child classes");
    }
}

答案 4 :(得分:0)

假设您正在讨论类本身而不是类实例, 我认为你唯一能做的就是让你想要限制的类有一个私有构造函数,并将(一个也是唯一的)子类声明为一个嵌套类。