gpt4 book ai didi

java - 如何在没有 instanceof 或 getClass 的情况下访问类特定方法

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:49:07 25 4
gpt4 key购买 nike

假设我有以下接口(interface)和实现:

interface Weapon{
int attack();
}

public class Sword implements Weapon {

//Constructor, and Weapon interface implementation
//...
public void wipeBloodfromSword(){}
}


public class ChargeGun implements Weapon {
//Constructor, and Weapon interface implementation
//...
public void adjustlasersight(){}
}

并像这样存储它们:

List<Weapon> weaponInventory = new ArrayList<Weapon>();
weaponInventory.add(new Sword());
weaponInventory.add(new ChargeGun());

问题:

鉴于它们存储在 List<Weapon> 中我显然只能访问 Weapon 中声明的方法interface .如果 downcasting和使用 instanceof/getClass() 应该避免,我将如何访问类特定方法 wipeBloodfromSword()adjustlasersight()

可能的解决方案:

鉴于调用攻击方法前后都有 Action ,我可以这样重写我的界面:

interface Weapon{

//Can reload a weapon, adjust a laser sight
//do anything to the weapon to prepare for an attack
void prepareWeapon();
int attack();
//Not sure of a more proper name,
//but you can wipe blood off sword or take off silencer
void postAttackActions();
}

虽然我控制着这个爱好项目,但我可能会遇到无法更改 interface 的情况。 , 而 interface重写可能会解决这个具体问题,如果我必须离开 interface 怎么办?原样?

最佳答案

由于您有一组固定的类,您可以使用访问者模式,该模式无需显式向下转换即可工作。

class WeaponVisitor {
void visit(Sword aSword) { }
void visit(ChargeGun aGun) { }
}

// add accept method to your Weapon interface
interface Weapon {
...
void accept(Visitor v);
}

// then implement accept in your implementing classes
class Sword {
...
@Override
void accept(Visitor v) {
v.visit(this); // this is instanceof Sword so the right visit method will be picked
}
}

// lastly, extend Visitor and override the methods you are interested in
class OnlySwordVisitor extends Visitor {
@Override void visit(Sword aSword) {
System.out.println("Found a sword!");
aSword.wipeBloodfromSword();
}
}

关于java - 如何在没有 instanceof 或 getClass 的情况下访问类特定方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46921818/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com