Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.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_Oop_Polymorphism - Fatal编程技术网

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

在java中处理这个问题的首选方法是什么,java,oop,polymorphism,Java,Oop,Polymorphism,假设我有以下课程: 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(

假设我有以下课程:

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,那就很容易了,但是在没有意义的情况下呢?i、 e.doSomething()是在类C上定义的,其实现高度依赖于C的内部状态。

您应该将
doSomethingA
的实现推送到类
a
doSomethingB
推送到
classB
,在接口
X
中定义
doSomething
,只需调用
X.doSomething()
(在的行中)

考虑到关于处理对
X
类型
A
B
的依赖性问题的最新编辑,当然不应该使用
instanceof
操作符,因为它建立了对底层实现类的硬依赖,并且当
X
传递给
C时,代码会失败得很惨。doSomething()
是一个修饰实例

这样一来,
C.doSomething()
的实现将归结为您必须使用
a
B
中的信息,在该点运行的步骤应抽象为
a
B
中的方法,并在接口
X
中声明。这将确保
X
的任何新实现也实现
C
所依赖的方法,从而使代码更好地可维护。HTH.

这很简单:

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

这样做的正确方法是

首先,我将实现一个接口,而不是扩展:),我的第一个想法是这样

  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");
        }

      }

    }
现在你可以使用

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

可以将do something()移动到接口X中吗?然后只需调用x.do something(),而不需要强制转换或使用的实例。

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

这不是他想传递变量而不是调用方法的解决方案。好吧,但我不明白为什么需要将同一个对象传递给方法。此外,在doSomething中有“this”,无论如何,因为我没有给出任何上下文,它可能看起来很容易,但实际上可能不那么容易。看我的编辑。是的,明白了。在对问题的评论中问了一些问题这不是他想要传递变量而不是调用方法的解决方案。对于一个大多数人都会错误地阅读和回答的微妙问题+1。我会尝试重新设计它。顺便问一下,我们需要“通用”doSomething(X X)方法吗?例如,我们可以简单地将C的状态的必要部分传递给A和B的实现吗?或者将C.doSomethingA/B以某种方式拆分为几个部分,在C中有一个公共部分,在a和B中分别有不同的部分?您能分享更多关于您在这些方法中实际执行的操作的信息吗?当然,我觉得重新设计是必要的,但由于细节目前非常抽象,很难提出建议。我在几种不同的情况下遇到过。这就是为什么我要寻找一个通用的解决方案。@AmitD,从问题中可以看出,编辑是在回答之后进行的。请参阅对我的回答的编辑,对问题中的新要求进行评论。
public void doSomething(X x) {
  x.doSomething(C c);
}