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

           Ball
          /    \
  LegalBall    IllegalBall

我有2种方法:
class o {
AddBall(LegalBall l)
AddBall(IllegalBall i)
}

在另一个类中,我想做以下事情:
o.AddBall(myBall);

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

有人知道我能实现我想要的吗?或者如果周围有很好的解决方法

谢谢

编辑:我正在尝试构建的应用程序是板球记分卡类型的东西。因此,根据保龄球的类型,其他各种元素也应更改。

我的初衷是能够指定球的类型并通过某种形式的UI进行得分,然后从BallFactory创建合适的类型的球,然后,例如,当我向团队得分发送不得分时,它将值添加到球队得分,但也将值(value)添加到无球计数器中。但是,当我将同一球交给板球运动员分析来处理时,其得分应仅为板球运动员总分的value-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");
    }
}

10-02 02:35
查看更多