Angenommen habe ich die folgende Schnittstelle und Implementierung:Wie klassenspezifischen Methoden ohne Instanceof zuzugreifen oder getClass
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(){}
}
und speichern sie wie folgt aus:
List<Weapon> weaponInventory = new ArrayList<Weapon>();
weaponInventory.add(new Sword());
weaponInventory.add(new ChargeGun());
Problem:
Da sie in der List<Weapon>
gespeichert sind habe ich natürlich nur Zugriff auf die Methoden in derdeklariertinterface
. Wenn downcasting
und die Verwendung von instanceof/getClass()
vermieden werden sollte, wie bekomme ich Zugriff auf die Klassenspezifischen Methoden wipeBloodfromSword()
und adjustlasersight()
?
Mögliche Lösung:
Da es Aktionen vor und nach dem Angriff Methode aufgerufen wird, kann ich meine Schnittstelle wie folgt neu schreiben:
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();
}
Während, ich bin in Kontrolle über dieses Hobby-Projekt, könnte ich in eine Situation geraten, wo ich nicht in der Lage bin, die interface
zu ändern, während die interface
umschreiben kann dieses spezifische Problem zu lösen, was soll ich tun, wenn ich die interface
wie verlassen muss?
"Was soll ich tun, wenn ..." ist keine gute Frage, die man auf SO stellen sollte. –
Wenn Sie Ihre Schnittstelle nicht ändern können, müssen Sie entweder * instanceof oder reflection verwenden. Aber die richtige Antwort ist, deine Schnittstelle zu ändern. –
Statische Klasse ist keine richtige Antwort ??? –