Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何避免使用运算符实例?_Java_Android - Fatal编程技术网

Java 如何避免使用运算符实例?

Java 如何避免使用运算符实例?,java,android,Java,Android,我有一个类,即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运算符时,都

我有一个类,即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();
 }
}

按照您问题中当前的代码:

A
基类中使用抽象方法可以避免
instanceof
,如下所示:

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();
    }
}
或者在您的界面中,如下所示:

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();
    }
}
您可以这样实现:

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();

您可以向A中添加一个抽象方法,并在B中实现它来做一件事,在C中实现它来做另一件事。通过在
Base
中包含每个人都可以/必须重写的
m()
。@khelwood但是m2()和m3()的返回类型是不同的。但是您忽略了
Test
类中的返回类型。那又有什么关系呢?给你的抽象方法返回类型
void
,并放弃返回值。然后发布代码,说明你需要如何使用这些方法,否则有人会建议你如何做得不同吗?