【问题标题】:Differentiate blocks of code based on class without instanceof基于类区分代码块而不使用 instanceof
【发布时间】:2016-01-28 17:35:30
【问题描述】:

所以我有以下接口I,它由AB 类实现:

interface I { ... }
class A implements I { ... }
class B implements I { ... }

然后我有另一个接口OverrideMe,其方法有一个对象I作为参数,以及一个覆盖该方法并根据该参数的实际类表现不同的类:

interface OverrideMe {
   void method(I parameter)
}

class Overriding implements OverrideMe {
   @Override
   void method(I parameter) {
      if (I instanceof A) {
         // Code block for A
      }
      else if (I instanceof B) {
         // Code block for B
      }
   }
}

有没有办法在不使用instanceof 的情况下按类型区分这两个代码块?我不确定这是否可以使用继承来完成。

请记住,我无法控制 IAB 和 ,我必须按原样使用它们。

【问题讨论】:

  • 你为什么不想这样做?
  • 如果你想调用一个A和B都实现的方法,你不需要那个区分,动态方法查找就可以解决这个问题。例如,如果你想调用一个只有 B 实现的方法,那么你当然需要这样做(但只针对 B)。
  • 我不想这样做,因为显然“...最好避免在一系列 if/else 语句中使用 instanceof 运算符来根据类型区分代码块,如果这些类型通过继承相关,在基类中定义一个方法,并在这些类中使用重写的方法更简洁......”。

标签: java inheritance overriding instanceof


【解决方案1】:

是的,您可以根据您想要在代码块中执行的操作。如果你想在 A 或 B 的实例上操作一些 b 逻辑。你可以在接口 I 中提供方法声明,并在 A 和 B 类中提供实现。示例,

interface I { 
   void doSomething();
 }
class A implements I {
   void doSomething(){
    //do something here 
} 
 }
class B implements I { 

   void doSomething(){
    //do something here 
} 
 }

interface OverrideMe {
   void method(I parameter)
}

class Overriding implements OverrideMe {
   @Override
   void method(I parameter) {
       parameter.doSomething();
   }
}

如果不是上述情况,您可能必须使用instanceof

【讨论】:

  • 感谢 Raunak,您的解决方案确实有效且有意义,我的问题是我无法控制 I、A 或 B,因此我无法向它们添加方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-08
  • 2016-06-21
  • 1970-01-01
  • 2018-12-12
  • 1970-01-01
  • 1970-01-01
  • 2012-07-24
相关资源
最近更新 更多