gpt4 book ai didi

java - 通过类层次结构发生尾递归

转载 作者:太空宇宙 更新时间:2023-11-04 09:19:11 25 4
gpt4 key购买 nike

嘿,你们这些人,

我问自己以下问题。这应该在 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扩展的。我现在想要访问 ABC 中的所有值。我如何强制执行,每当添加新子类时,程序员都被迫定义这些 AInterface 枚举(可选),以及如何强制他实现一个方法,然后在类层次结构中递归调用该方法(不是可选)。我不需要定义抽象方法或重写抽象方法的帮助。我想要做的不是覆盖现有的方法,也不向每个被调用的继承类添加抽象方法。

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

最佳答案

方法的可见性很重要。您不能强制子类实现现在不是抽象的 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

关于java - 通过类层次结构发生尾递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58559780/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com