我正在用 Java 构建一个简单的游戏。我有几个课程,我省略了与我的问题无关的字段:
public class Character {
//stores relics and artifacts
public Set<Collectable> inventory;
public void collect(Collectable collectable) {
collectable.collect(this);
}
}
public class Artifact extends Collectable {
@Override
public void collect(Character character) {
character.inventory.add(this);
}
}
public class Relic extends Collectable {
@Override
public void collect(Character character) {
character.inventory.add(this);
}
}
public class Spell extends Collectable {
@Override
public void collect(Character character) {
Wizard wizard = (Wizard) character;
wizard.spellBook.add(this);
}
}
public class Wizard extends Character {
//stores spells
public Set<Collectable> spellBook;
}
public class Warrior extends Character {
//fields and methods ommited
}
到目前为止,当我收集法术时,它必须进入巫师的法术书。战士不能收集法术,他们没有法术书。如果我从 OOP POV 中正确理解,Collectable 必须能够在收集时决定它的去向(库存或法术书),因此我在上面的解决方案。
我的问题是我必须在 Spell.collect(Character) 中使用类型转换才能将 Spell 放入向导的 spellBook,因为默认情况下,spellBook 在 Character 上不可见,我认为它不应该是,因为那时战士也会有法术书。这违背了开闭原则,因为如果我想添加一个也可以收集法术的术士,我必须修改法术以尝试将它也施放给术士。
您能否建议一个解决方案或设计模式,以便我可以在不违反开闭原则的情况下收集我的收藏品?