java - 当参数是给定类型的子类时如何调用重载方法?
问题描述
我有一个抽象类、两个名为的A
子类和两个位于单独类中的重载方法:B
C
public void process(B objB) {...}
public void process(C objC) {...}
从存储库中,我检索了一个类型为的实体,A
我想进行如下调用:
A objA = repo.findById(id);
process(objA);
我知道需要强制转换,但我不想使用 theinstanceof
或大量if
语句进行大量检查。
实现这种方法调用的最佳选择是哪些?而且这样的代码设计好不好?
解决方案
使用instanceof
不是一个好的选择,特别是如果你有很多地方需要访问特定的子类。
显而易见的方法是将没有参数的抽象方法添加到基类中,并通过从另一个类
process()
调用相应的方法并将引用传递给它来在子类中实现它。process(this)
this
当首选从类层次结构中划分处理逻辑时(大概是您的情况),有一对模式:Strategy或更一般的Visitor。这是访问者模式使用的示例:
abstract class A { <T> T accept(Visitor<T> visitor); } class B extends A { @Override public <T> T accept(Visitor<T> visitor) { return visitor.visit(this); } } class C extends A { @Override public <T> T accept(Visitor<T> visitor) { return visitor.visit(this); } } interface Visitor<T> { T visit(B bObject); T visit(C cObject); }
然后通过实现相应的访问者来定义特定的操作:
Visitor<Integer> visitor = new Visitor<Integer>() { @Override public Integer visit(B bObject) { // TODO do something with bObject return null; } @Override public Integer visit(C cObject) { // TODO do something with cObject return null; } };
并调用接受:
A objA = repo.findById(id); Integer result = objA.accept(visitor);
推荐阅读
- excel - 在 Excel 中查找部分字符串之间的匹配项
- parsing - 解析 802.11 动作无 ack 帧
- python - matplotlib,在另一个子图之上放置一个透明子图
- javascript - 完成所有函数语句后的打字稿调用语句
- bootstrap-4 - 我们如何在 Bootstrap 4 中创建一个可滚动的列,并且内容保留在视口中?
- c# - 如何删除卸载安装程序后创建的文件夹?
- javascript - 如何验证联系表 7 提交
- c++ - 如何使用 OpenMP 通过 C++ std::set 并行化 for 循环?
- raku - 当使用单个 `^` 或 `$` 时,trans 函数永远挂起
- c++ - BST有什么问题