java - 通过类层次结构发生尾递归
问题描述
嘿,你们那里的人,
我在问自己以下问题。这应该在 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
值。我如何强制执行,每当添加新的子类时,程序员都被迫定义这些枚举(可选),以及我如何强制他实现一个方法,然后在类层次结构中递归调用(非可选)。我不需要帮助定义抽象方法或覆盖一个。我想要做的不是覆盖现有的,也不是向每个被调用的继承类添加抽象方法。B
C
AInterface
老实说,我不知道如何问这个问题,但我希望有人明白我的意思。如果没有发表评论。
解决方案
方法的可见性很重要。您不能强制子类实现现在 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
推荐阅读
- java - Swagger 生成的文件使用神秘的导入
- javascript - javascript - 如何仅将 13-14 英寸笔记本电脑屏幕的所有浏览器缩放级别降低到 80%?
- javascript - 检测集合中最靠近窗口的元素
- sql - 如何根据 fetch cteTable 更新某个字段
- google-analytics - 我是否需要在谷歌分析中为每个 android 应用程序创建一个属性?
- angular - 云构建不适用于不同的环境角度
- firebase - Firebase 部署错误“错误:函数未正确部署。”
- python - pyqt中QMenu的圆角
- asp.net-mvc - 添加更多 65 列时数据表给出错误?
- swift - 主机应用程序关闭时如何在 Widget iOS 14 中重新加载从 CoreData 获取数据