java - 如何避免使用 Instanceof 运算符?
问题描述
我有一个类,即 A.java 和两个子类 B 和 C,它们扩展了类 A。假设类的结构如下。
class A implements Base{
@Override
void m1(){
//some code
}
}
Class B extend A{
ABC m2(){
}
}
Class C extend A{
XYZ m3(){
}
}
现在我正在多个地方实施以下方式。每次使用 instanceOf 运算符,都很忙。如何避免使用 instanceOf 运算符。
Class Test {
public void getData(Base aData){
A a = aData;
if(a instance of B){
ABC aBC = ((B)a).m2();
abc.someData();
}
else
XYZ xYZ = ((C)a).m3();
xYZ.someOtherData();
}
}
解决方案
按照您问题中当前的代码:
if (a instanceof B) { ABC aBC = ((B)a).m2(); abc.someData(); } else { XYZ xYZ = ((C)a).m3(); xYZ.someOtherData(); }
您可以避免在基类instanceof
中使用抽象方法,如下所示:A
abstract class A implements Base {
...
abstract void m();
}
或者在你的界面中是这样的:
interface Base {
...
void m();
}
你像这样实现:
class B extends A {
ABC m2() {
// whatever you have here
}
@Override
void m() {
ABC abc = m2();
abc.someData();
}
}
class C extends A {
XYZ m3() {
// whatever you have here
}
@Override
void m() {
XYZ xYZ = m3();
xYZ.someOtherData();
}
}
然后你可以instanceof
用
a.m();
推荐阅读
- r - 将时间和日期分成不同的列(格式=2019-05-26T13:50:56.335288Z)
- php - 如何将 Oracle 列中的数据添加到 PHP 数组中?
- ruby-on-rails - 是否可以在 Action Mailer 中转发邮件对象
- c# - 使用 Unity C# 通过网络发送图片
- c# - c#Web服务中的MessageSecurityException
- python - 如果它在正确的渠道中,我如何让我的机器人只响应
- angular7 - 在 Angular 中查看特定日期的时间段的屏幕
- python - 如果将 None 作为类型提示替换为 type(None) 为什么它们在注释时表现不同?
- c# - 一段时间后角色统一移动
- excel - 显示 1/8 英寸的 VBA 用户定义函数显示为空白