Java 如何避免使用运算符实例?
我有一个类,即a.java和两个子类B和C,它们扩展了类a。 假设类的结构如下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运算符时,都
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
,并放弃返回值。然后发布代码,说明你需要如何使用这些方法,否则有人会建议你如何做得不同吗?