[英]Avoiding instanceof Java
我試圖找到一種方法來繞開instanceof的使用。 我創建了一個類Item,其中包含多個子類,例如WeaponItem和BodyItem。 現在,我想進行一個諸如equip(Item)的調用,它應該自行確定應該調用哪個重載函數,例如equip(BodyItem)。
在這種情況下,有沒有一種方法可以繞開instanceof的使用,您會建議什么? 我聽說在大多數情況下,使用instanceof是不好的做法,因此,我想知道替代方法是什么。
碼:
inv.equip(it); // inv = inventory object, it = Item
庫存類中的Equip函數示例,我希望如何使用它
public void equip(HelmItem it)
{
if (it != this.getHelm())
{
this.setHelm(it);
}
}
我以前怎么過的:
public void equip(Item it)
{
if (it instanceof WeaponItem)
{
if (it != this.getWeapon())
{
this.setWeapon((WeaponItem) it);
}
} etc for all subclasses of item
}
確實,這可以通過訪客模式解決。
但是,它不一定是成熟的訪客,而是它的簡化版本。 您可以將庫存傳遞給物料,然后讓物料用它做任何想做的事情:
abstract class Item {
public abstract void equip(Inventory inv);
}
class HelmItem extends Item {
@Override
public void equip(Inventory inv) {
inv.setHelm(this);
}
}
class WeaponItem extends Item {
@Override
public void equip(Inventory inv) {
inv.setWeapon(this);
}
}
然后,您可以致電:
it.equip(inv)
沒有instanceof
運算子。
為什么不將方法放在Item
具體類中,並且它可以自我裝備? 這有點反常,但可以解決您的問題。
public class SomeConcreteItem extends Item {
public void equip(Body body) {
// Just an example.
body.getSections().get(0).equip(this);
}
}
這樣,具體的實現就知道如何裝備自己,而使用它的類則不在乎。 您可以通過Item
超類引用它,並提供Item
超類具有抽象方法的方法public void equip(Body body);
,那么您永遠不需要了解具體的實現,因此也不需要instanceof
運算符。
設計模式介紹
您在引入設計模式時應該小心。 當確實可以使用更簡單且(在我看來)更優雅的東西時,人們習慣直接跳到復雜的模式來解決問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.