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)
# 1 楼答案
在中具有重载方法:
或者,如果调用来自构造函数内部,您也可以重载它
# 2 楼答案
你需要发布代码来修复它。。。您应该使用中介,因为您正在两个对象之间切换调用
我有两个从Player继承的类:SimplePlayer和InterleavedPlayer
嗯
A类有一个播放器字段,设计为SimplePlayer或InterleavedPlayer。类A希望在这些播放器上调用B.setPlayer(),而不考虑对象是播放器的哪个子类
嗯
我重载了子类的B.setPlayer(),以避免在泛化的B.setPlayer(Player)方法中使用instanceof
嗯
但是在A调用B.setPlayer()时,我得到一个指向B.setPlayer(Player)的符号未找到错误 嗯
B需要一个交错的播放器,对吗? 在一个名为B.setPlayer((InterleavedPlayer)thePlayer)的游戏中,将播放器转换为一个Interleaved播放器,你可以用很多不同的方法来解决这个问题,但是没有代码可以看到,它可能有很多单词
特别是,, 需要的代码是Player::setPlayer和interleave::setPlayer
# 3 楼答案
使用instanceof并不一定是邪恶的。与所有设计决策一样,它涉及到权衡。我想这里要问的问题是,所讨论的代码是与A还是B结合得更紧密
例如,如果创建了一个新的Player子类,会发生什么?您是否需要修改B以添加新的setPlayer方法?如果是这样的话,在B中有一个通过instanceof分派的泛型方法是有意义的,因为您无论如何都必须修改B
# 4 楼答案
出现错误的原因是,我们没有在java中对方法参数进行运行时调度,只对调用它的对象进行调度。这意味着您调用它的对象的实际运行时类(
B
)会影响选择哪个函数,但是对参数(Player
)的引用的编译时类只会影响函数的选择解决这个问题的答案将取决于为什么B需要2个函数,以及差异是否可以转移到各个播放器类中,以及设计是否合理。i、 额外的计算是因为B还是因为玩家的职业