Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中的多个子类_Java_Inheritance - Fatal编程技术网

java中的多个子类

java中的多个子类,java,inheritance,Java,Inheritance,我想知道一些在java中限制给定类的多个子类的过程 e、 g.如果我有类A,那么只有一个类可以扩展A,即不允许超过一个子类 在一次公司面试中,我被问到了这个问题,我非常感谢您的帮助和指导。您可以使用工厂设计模式来创建类层次结构的实例,并使用一个静态计数器来指示实例的数量。当数量超过您的需要时,在factory方法上抛出一个异常。当您尝试创建一个子类时,您使用的是factory。工厂可以保留某种计数器或逻辑来确定是否允许创建类。如果确定无法创建该类,则抛出异常 try { ChildClas

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

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


在一次公司面试中,我被问到了这个问题,我非常感谢您的帮助和指导。

您可以使用工厂设计模式来创建类层次结构的实例,并使用一个静态计数器来指示实例的数量。当数量超过您的需要时,在factory方法上抛出一个异常。

当您尝试创建一个子类时,您使用的是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");
    }
}
试试看{
ChildClass ChildClass=ChildFactory.createChild();
}捕获(ChildCreationException e){
...
}
班级儿童工厂{
公共静态最终int MAX_CHILDREN=2;
公共静态int numChildren=0;
public ChildClass createChild()抛出ChildCreationException{
if(儿童<最大儿童){
儿童++;
返回新的子类();
}
抛出新的ChildCreationException(“超过最大子类数”);
}
}

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

更新:这就是你想要的吗(来自)


您不能在密封类之外创建更多的子类,因为构造函数不可见。

您不能在编译器级别限制它。您可以在运行时“某种程度上”限制这一点。创建静态变量,该变量将包含子级的
。此变量将由基类的构造函数更新。如果实例化了其他子级,则构造函数将引发异常:

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");
        }
    }
}
类基{

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

请查看此SO链接:不超过一个子类或一个子对象?您可以通过在抽象父类中一次性使用来控制实例的数量:@SLaks:我知道它不一样(可能是我没有将其标记为重复的原因):D我指的是机制可以调整,因为在实例化子类时,也会调用父类的构造函数。这不是一种优雅的方法,但它可能只是从访谈的角度工作。这对于创建子类的实例很好,但不会限制子类本身的声明。同意。我不理解将问题归结为运行时行为。IMHO,在编译时+1期间,无法停止为密封类方法创建子类。这比我在评论中建议的黑客方式更优雅。@DNA感谢你使用这种方法。我尝试过,通过限制子类的进一步声明,效果很好。
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");
        }
    }
}