De oplossingen die gegeven zijn houden echter geen rekening met het feit dat er in main "wapens en schilden" worden bijgehouden die beide een parent class hebben (Item).
Dit betekend dus dat je de volgende opties krijgt:
Code:
Wapen w = new Wapen("Geweer");
Schild s = new Schild("Metalen plank");
Item i = new Wapen("Geweer");
De 3rde optie (Item i = ...) zal GEEN methoden van de klasse wapen kennen en dus een fout geven zodra je een methode uit wapen wilt gebruiken.
Dit is (onder andere) op te lossen door te kijken van welke classe i is (wapen). Dit kan met:
Code:
if(i instanceof Wapen){
((Wapen) i).schiet();
}
Nog mooier zou het echter zijn om alle Items een bepaalde "actie" methode te geven. Zodat alleen die methode wordt aangeroepen.
Dit doe je door in de Item class (die abstract zou moeten zijn overigens) een emthode "doActie" toe te voegen en deze in de subklasses te OVERRIDEN. in de methode doActie voer je dan de specifieke schiet methode uit.
Als je dat gedaan hebt kun je alle "Items" aanmaken met
Code:
Item i = new Wapen("");
Item ii = new Schild("");
Waarop je dan de methode "doActie()" kunt aanroepen om verschillende dingen te doen.
Dit is zeer handig bij het gebruiken van een LIJST van "Items" (uitgewerkt in de klassen hieronder).
Bijhoorende voorbeeldcode:
Item.java
Code:
public abstract class Item {
private String naam;
public Item(String naam){
this.naam = naam;
}
public void doActie(){
}
}
Wapen.java
Code:
public class Wapen extends Item {
public Wapen(String naam) {
super(naam);
}
public void doActie(){
schiet();
}
public void schiet(){
System.out.println("pew pew");
}
}
Schild.java
Code:
public class Schild extends Item {
public Schild(String naam) {
super(naam);
}
public void doActie(){
verdedig();
}
public void verdedig(){
System.out.println("Ik verdedig");
}
}
App.java (main)
Code:
public class App {
public static void main( String[] args ) {
new App();
}
private ArrayList<Item> mijnItems = new ArrayList<Item>();
public App(){
metLijst();
}
public void metLijst(){
//items toevoegen aan de lijst. (kan zoveel als je wilt)
mijnItems.add(new Wapen("Geweer"));
mijnItems.add(new Wapen("Geweer"));
mijnItems.add(new Schild("Metalen plank"));
for(Item i:mijnItems){
i.doActie();
}
}
public void goedeManier(){
Wapen w = new Wapen("Geweer");
Schild s = new Schild("Metalen plank");
Item i = new Wapen("Geweer");
w.doActie();
s.doActie();
i.doActie();
//i vervangen met schild
i = new Schild("Metalen plank");
i.doActie();
}
//niet goede manier
public void slechteManier(){
Item i = new Wapen("Geweer");
if(i instanceof Wapen){
((Wapen) i).schiet();
}
}
}