当前位置:  开发笔记 > 编程语言 > 正文

将超类作为参数传递给期望子类的方法

如何解决《将超类作为参数传递给期望子类的方法》经验,为你挑选了1个好方法。

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

           Ball
          /    \
  LegalBall    IllegalBall

我有两种方法:

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

在另一个课程中,我想做以下事情:

o.AddBall(myBall);

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

有谁知道我怎么能达到我想要的目的?或者如果有一个好的工作

谢谢

编辑:我正在尝试构建的应用程序是Cricket记分卡类型的东西.因此,根据击球的类型,各种其他元素应该改变.

我的初衷是能够指定球类型并从某种形式的UI中得分,然后从BallFactory创建一个合适的类型球,然后例如当我向团队得分发送一个无球时,它会将值添加到球队得分,但也增加了无球计数器的价值.但是当我向Batsmens Analysis提供相同的球来处理它时,它应该只能达到击球手总数的值-1.

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



1> dalle..:

您可以使用访客模式.

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

推荐阅读
mylvfamily
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有