繁体   English   中英

在java中处理这个问题的首选方法是什么

[英]What is the preferred way to handle this in java

假设我有以下课程:

public interface X {
...
}

public class A implements X {
...
}

public class B implements X {
...
}

现在让我说我有一个方法,它采用X类型的对象,并且必须以不同方式处理X的每个实现。 天真的做法是:

public void doSomething(X x) {
  if(x instanceof A)
    doSomethingA((A) x);
  else if(x instanceof B)
    doSomethingB((B) x);
}

......但这看起来特别难看,而且不是多态的。 一般来说处理这种情况的干净方法是什么?

编辑:当然,如果我可以将doSomething()的实现推送到A类和B类,那将会很容易,但在那些没有意义的情况下呢? 即doSomething()是在C类上定义的,并且实现高度依赖于C的内部状态。

这很容易:

public interface X {
  int doSomething();
}

public class A implements X {
  public int doSomething() {
    // implementation in A
  }  
}

public class B implements X {
  public int doSomething() {
    // implementation in B
  }  

}

更新:好的,似乎在这里我们在C中有一些算法,它依赖于C的状态以及A / B的差异。 然后我会尝试拆分该算法,以便C类只有A和B的通用实现,并且A / B相关的部分应该作为在C中调用的相同方法的特定实现转到适当的类。如果可能的话,C的状态可以部分传递给A和B的doSomething

你应该推动实施doSomethingAAdoSomethingBclassB ,定义doSomething在界面X ,只是调用x.doSomething()在东西线双重分发 )。

考虑到关于处理对X类型AB的依赖性的问题的最新编辑,当然不应该使用instanceof运算符,因为它在底层实现类上建立了硬依赖性,并且当X x时代码会失败。传递给C.doSomething() X x是一个装饰实例。

AFAIK, C.doSomething()的实现将归结为你必须使用来自AB的信息,并且在该点运行的步骤应被抽象为AB方法,在接口X声明。 这将确保X任何新实现也实现C依赖的此方法,从而使代码更易于维护。 HTH。

正确的方法是访问者模式

首先,我会实现一个接口而不是扩展:)我的第一个应该是这样的

  class Parent {
      public Parent() {

      }
    }

    class Child extends Parent {
      public Child() {
        super();
      }
    }

    public class MainClass {
      public static void main(String[] a) {

        Child child = new Child();
        if (child instanceof Parent) {
          System.out.println("true");
        }

      }

    }
 public interface X {
     doSomeThing();
    }

public class A implement X {
  doSomeThing(){}
}

public class B implement X {
   doSomeThing() {}
}

现在你可以使用了

  X a = new A();
  a.doSomeThing();

你可以将某些东西()移到界面X中吗? 然后只需调用x.do something()而无需强制转换或使用实例。

这更像是一个设计问题。 如果doSomething()的A和B实现严重依赖于C对象状态,则可以将其作为参数传递:x.doSomething(C c)


在界面X中创建doSomething():

public interface X {
   doSomething(C c);
}

public class A extends X {
   doSomething(C c) {
    ...
   }
}

public class B extends X {
   doSomething(C c) {
    ...
   }
}

然后,您的初始方法变为:

public void doSomething(X x) {
  x.doSomething(C c);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM