首页 > 解决方案 > 通过类层次结构发生尾递归

问题描述

嘿,你们那里的人,

我在问自己以下问题。这应该在 Java 中完成,但由于我不知道该怎么做,所以一个概念也会有所帮助:我有以下代码:

public abstract class A {

   protected enum AType implements AInterface {
     A_VALUE
   }

   public AInterface[] possibleRequests() {
      AInterface types = AType.values();
      return ArrayUtils.concat(types, possibleFurtherRequests());
   }

   public abstract AInterface[] possibleFurtherRequests();

}

public class B extends A {

   protected enum BType implements BInterface {
     B_VALUE
   }

   @Override
   protected AInterface[] possibleFurtherRequests() {
      //Here is my problem.
      return BType.values();
   }
}

public interface AInterface {
}

public interface BInterface extends AInterface {
}

我想做的是possibleRequest无限深入地使用这些方法。它们只能通过 访问A,我不知道也不应该知道该类型的对象A属于哪个类。

我所说的无限深度的意思是说这个概念被扩展了C extends B。我现在想从 和 访问所有A值。我如何强制执行,每当添加新的子类时,程序员都被迫定义这些枚举(可选),以及我如何强制他实现一个方法,然后在类层次结构中递归调用(非可选)。我不需要帮助定义抽象方法或覆盖一个。我想要做的不是覆盖现有的,也不是向每个被调用的继承类添加抽象方法。BCAInterface

老实说,我不知道如何问这个问题,但我希望有人明白我的意思。如果没有发表评论。

标签: javainheritancerecursionreflection

解决方案


方法的可见性很重要。您不能强制子类实现现在 NOT 抽象的 possibleFurtherRequests,但这是他们需要的唯一方法。你也不能强迫他们调用 super 方法。代码审查很好地为此工作。

protected enum AType implements AInterface {
    A_VALUE
}

protected enum BType implements BInterface {
    B_VALUE
}

public abstract class A {

    final public AInterface[] possibleRequests() {
        return possibleFurtherRequests();
    }

    protected AInterface[] possibleFurtherRequests() {
        return AType.values();
    }

    protected AInterface[] combine(AInterface[] some, AInterface[] more) {
        AInterface[] combined = new AInterface[some.length + more.length];
        System.arraycopy(some, 0, combined, 0, some.length);
        System.arraycopy(more, 0, combined, some.length, more.length);
        return combined;
    }
}

public class B extends A {

    @Override
    protected AInterface[] possibleFurtherRequests() {
        return combine(super.possibleFurtherRequests(), BType.values());
    }
}

public interface AInterface {
}

public interface BInterface extends AInterface {
}

public void test() {
    AInterface[] result = new B().possibleRequests();
    Stream.of(result).forEach(System.out::println);
}

结果是

A_VALUE
B_VALUE

推荐阅读