【问题标题】:Dynamic Binding with subclasses "no suitable method found"与子类“找不到合适的方法”的动态绑定
【发布时间】:2015-03-13 09:10:26
【问题描述】:

B 扩展 A,C 扩展 A

试图改变:

   public void convertA(A a) {

    AClass clazz = new AClass();

    if (a instanceof B) {
        clazz.setX(convertBtoX(a));
    } else if (a instanceof C) {
        clazz.setY(convertCtoY(a));
    }

}

public void convertAbis(A a) {

    AClass clazz = fill(a); //ERROR NO SUITABLE METHOD FOUND FOR FILL

}


public AClass fill(B b) {
     clazz.setX(convertBtoX(b));
}

public AClass fill(C c) {
    clazz.setY(convertCtoY(c));
}

导致“找不到合适的填充方法”错误。 我怎样才能删除“实例”开关? A、B、C 是数据传输对象,不应该知道 X Y 和反之亦然,所以我不能简单地将填充方法添加到 A、B、C 类

建议?

【问题讨论】:

    标签: java oop dynamic-binding


    【解决方案1】:

    fill(a) 不会自动匹配 B 和 C 参数,而是寻找 fill(A a)

    要解决您的问题,请尝试以下操作。

    首先在A类中创建一个抽象函数void fill(AClass c)

    B类中创建这个函数:

    public void fill(AClass clazz){
        clazz.setX(convertBtoX(this));
    }
    

    C 类做几乎相同的操作。

    public void fill(AClass clazz){
        clazz.setY(convertCtoY(c));
    }
    

    然后像这样使用:

    void convertABis(A a){
         AClass clazz = new AClass();
         a.fill(clazz);
    }
    

    【讨论】:

    • "A、B、C 是数据传输对象,不应该知道 X Y 和反之亦然,所以我不能简单地将填充方法添加到 A、B、C 类。"
    【解决方案2】:

    我认为问题在于A 不是BC 的子类,但有BCA 的子类。因此,将 A 类型的对象传递给方法 fill 是不可能的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-26
      • 2019-02-01
      • 2013-11-25
      • 2015-02-02
      相关资源
      最近更新 更多