【发布时间】:2019-11-22 13:12:16
【问题描述】:
我在我的程序中遇到了受孕问题。
我有 4 个类(ChildA、ChildB、ChildC)扩展了一个父类(Parent)
我有一个类似的方法:
public void doInteraction(Parent a, Parent b){
a.doActionWith(b);
b.doActionWith(a);
}
我的 3 个子类和父类:
public abstract class Parent {
public abstract void doActionWith(Parent other);
}
class ChildA extends Parent {
@Override
public void doActionWith(Parent other) {
System.out.println("childA use doActionWith abstract");
}
public void doActionWith(ChildA chila) {
System.out.println("childA use doActionWith childA");
}
public void doActionWith(ChildB chilb) {
System.out.println("childA use doActionWith childB");
}
public void doActionWith(ChildC chilb) {
System.out.println("childA use doActionWith childC");
}
}
class ChildB extends Parent {
@Override
public void doActionWith(Parent other) {
System.out.println("childB use doActionWith abstract");
}
public void doActionWith(ChildA childa) {
System.out.println("childB use doActionWith childA");
}
public void doActionWith(ChildB chilb) {
System.out.println("childB use doActionWith childB");
}
public void doActionWith(ChildC chilb) {
System.out.println("childB use doActionWith childC");
}
}
class ChildC extends Parent {
@Override
public void doActionWith(Parent other) {
System.out.println("childB use doActionWith abstract");
}
public void doActionWith(ChildA childa) {
System.out.println("childB use doActionWith childA");
}
public void doActionWith(ChildB chilb) {
System.out.println("childB use doActionWith childB");
}
public void doActionWith(ChildC chilc) {
System.out.println("childC use doActionWith childC");
}
}
当我调用 a.doActionWith(b);在 doInteraction 方法中: 抽象方法总是在 jvm 知道 a 和 b 的真实类型时使用。
为什么java不使用带有参数的特定方法与参数的类型完全匹配?
我找到的唯一解决方案是将对象转换为他们的子类型。 但我需要用实例检查他们的类型。(想象一下,如果我有 20 个子类)。 我记得我的研究表明,一个例子揭示了一个不好的概念。
我尝试了一些类似的东西
public abstract <C extends Parent> void doActionWith(C other);
但是一样。 我想象一个设计模式可以解决这个问题,但我没有找到。 也许我应该使用界面,但我不知道该怎么做。
感谢阅读。
法比恩。
【问题讨论】:
-
访问者模式是解决它的一种方法。 IMO 很难调试,但有时它仍然是必要的。
-
如果
Parent抽象在最重要的时候对您没有帮助,那么它的意义何在? (A、B和C类之间的关系在您需要使用它们共同的Parent时没有帮助)
标签: java design-patterns polymorphism