有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java使用重载的变种避免instanceof

我有两个从Player继承的类:SimplePlayer和InterleavedPlayer

类B有以下方法:setPlayer(SimplePlayer)和setPlayer(InterleavedPlayer)

A类有一个播放器字段,设计为SimplePlayer或InterleavedPlayer。类A希望在这些播放器上调用B.setPlayer(),而不考虑对象是播放器的哪个子类

我重载了子类的B.setPlayer(),以避免在泛化的B.setPlayer(Player)方法中使用instanceof

但是在A调用B.setPlayer()时,我得到一个指向B.setPlayer(Player)的符号未找到错误

我应该在这里使用什么设计方法来解决这个问题?(A实际上创造了玩家,因此在理论上它“知道”它传递给B的是什么。然而,由于A不加区别地对待它的玩家的方式,似乎只有一个它做事情的玩家才有意义,而不必区分SimplePlayer和InterleavedPlayer)


共 (4) 个答案

  1. # 1 楼答案

    在中具有重载方法:

    private Player;
    
    public void setPlayer(SimplePlager player) {
        this.player = player;
        b.setPlayer(player);
    }
    
    // similar for InterleavedPlayer
    

    或者,如果调用来自构造函数内部,您也可以重载它

  2. # 2 楼答案

    你需要发布代码来修复它。。。您应该使用中介,因为您正在两个对象之间切换调用

    我有两个从Player继承的类:SimplePlayer和InterleavedPlayer

    class Player{}
    class SimplePlayer extends Player {}
    class InterleavedPlayer extends Player{}
    

    A类有一个播放器字段,设计为SimplePlayer或InterleavedPlayer。类A希望在这些播放器上调用B.setPlayer(),而不考虑对象是播放器的哪个子类

    class A { Player field; }
    

    我重载了子类的B.setPlayer(),以避免在泛化的B.setPlayer(Player)方法中使用instanceof

    class B { 
        void setPlayer(InterleavedPlayer player) {  out.println( player );  }  
    }
    

    但是在A调用B.setPlayer()时,我得到一个指向B.setPlayer(Player)的符号未找到错误 嗯

    B需要一个交错的播放器,对吗? 在一个名为B.setPlayer((InterleavedPlayer)thePlayer)的游戏中,将播放器转换为一个Interleaved播放器,你可以用很多不同的方法来解决这个问题,但是没有代码可以看到,它可能有很多单词

    特别是,, 需要的代码是Player::setPlayer和interleave::setPlayer

  3. # 3 楼答案

    使用instanceof并不一定是邪恶的。与所有设计决策一样,它涉及到权衡。我想这里要问的问题是,所讨论的代码是与A还是B结合得更紧密

    例如,如果创建了一个新的Player子类,会发生什么?您是否需要修改B以添加新的setPlayer方法?如果是这样的话,在B中有一个通过instanceof分派的泛型方法是有意义的,因为您无论如何都必须修改B

  4. # 4 楼答案

    出现错误的原因是,我们没有在java中对方法参数进行运行时调度,只对调用它的对象进行调度。这意味着您调用它的对象的实际运行时类(B)会影响选择哪个函数,但是对参数(Player)的引用的编译时类只会影响函数的选择

    解决这个问题的答案将取决于为什么B需要2个函数,以及差异是否可以转移到各个播放器类中,以及设计是否合理。i、 额外的计算是因为B还是因为玩家的职业