java - 将父类(super class)作为参数传递给需要子类的方法

标签 java inheritance methods polymorphism overloading

我有一个看起来像这样的对象树

           Ball
          /    \
  LegalBall    IllegalBall

我有两种方法:

class o {
AddBall(LegalBall l)
AddBall(IllegalBall i)
}

在另一个类中我想做以下事情:

o.AddBall(myBall);

其中 myBall 是 Ball 类型。 并让它根据子类型调用正确的方法。 显然我不能这样做......参数不适用。

有谁知道我怎样才能实现我想要的?或者如果有好的解决办法

谢谢

编辑:我正在尝试构建的应用程序是 Cricket 记分卡类型的东西。因此,根据所投球的类型,其他各种元素也应该发生变化。

我的初衷是能够从某种形式的 UI 中指定球的类型和得分,然后从 BallFactory 创建一个适当类型的球,然后例如当我向球队得分发送一个无球时,它会添加将值加到团队得分上,但也将值添加到无球计数器中。但是,当我将同一个球交给击球手分析来处理时,击球手的总得分应该只有 1 分。

我希望这不是对我初衷的解释太糟糕。

最佳答案

您可以使用 Visitor pattern .

class Basket {
    void AddBall(LegalBall l) {
        System.out.println("LegalBall added to basket");
    }

    void AddBall(IllegalBall i) {
        System.out.println("IllegalBall added to basket");
    }
}

interface Ball {
    void AddBall(Basket b);
}

class LegalBall implements Ball {
    void AddBall(Basket b) {
        b.AddBall(this);
    }
}

class IllegalBall implements Ball {
    void AddBall(Basket b) {
        b.AddBall(this);
    }
}

或者更一般化:

interface BallVisitor {
    void visit(LegalBall l);
    void visit(IllegalBall i);
}

interface Ball {
    void accept(BallVisitor v);
}

class LegalBall implements Ball {
    void accept(BallVisitor v) {
        v.visit(this);
    }
}

class IllegalBall implements Ball {
    void accept(BallVisitor v) {
        v.visit(this);
    }
}

class Basket implements BallVisitor {
    void visit(LegalBall l) {
        System.out.println("LegalBall added to basket");
    }

    void visit(IllegalBall i) {
        System.out.println("IllegalBall added to basket");
    }
}

关于java - 将父类(super class)作为参数传递给需要子类的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/394299/

相关文章:

Java List<Map<String, Long>> 映射键的分组总和

Javascript继承实现问题

javascript - 如何在 JavaScript 中调用 onload 方法

java - 用JAVA写一个卖通票的方法,另一个卖票的方法

两个类之间的java.lang.StackOverflowError

PHP,将参数传递给对象方法或使用实例变量

java - 单击行/列时,ListSelectionEvent 异步触发 2 个触发器

java - 如何修复 Android 的 distanceBetween 方法语法?

java - 模拟 apache.commons.io.IOUtils 类

javascript - 类型继承: Why do you have to create a new object instead of setting the prototype directly?