Vraag ivm superclasses

Status
Niet open voor verdere reacties.

Vossenman

Nieuwe gebruiker
Lid geworden
26 feb 2016
Berichten
4
Hallo allemaal,

Ik heb een kleine vraag ivm met classes & super classes ;)
Een probleem dat ik niet weet **** ik er aan moet beginnen.

Ik heb een classe (Items), die dat ik op zijn beurt gebruik in een klasse main, om dingen aan te spreken.

Nu heeft die classe Items 2 "kleinere classes" (namelijk: Weapon & Armor),omdat er zowel Wapens als schilden aanwezig kunnen zijn ;) (Maar die hebben ofcourse andere eigenschappen)

Nu wil ik graag een functie van bv Weapon oproepen in mijn main classe ;) Maar hoe moet ik dat nu doen? :D
Dat weet ik niet :(
Iemand die mij kan helpen? :)
 
Is dat niet zo:

in de main:
Weapen wapen = new Weapen();
wapen.getFunctie();

in de class:
u functie op public zetten :)


mvg
 
Laatst bewerkt:
Best ik weet niet hoe groot je spel zal zijn


bekijk al eens https://code.google.com/archive/p/javamygame/downloads (ter ilustratie)

nu moet je eerst kijken je kan een collectie maken met wapens die rugzak noemt.
dan kan je een collectie maken mat wat je vast hebt nu kan je alles opbergen door gewoon te verzetten van collectie.

zorg voor elk object een paint heeft die eerst tekst toont en nadien kan je hem eruit laten zien hoe je wil.
nu een wapen is mooi als superklasse zo kan je verschillende types hebben met verschillende inhoud van kogels.
nu als je dan zou spelen zou sneller tot resultaat komen nu als je ver wil gaan dan kan je er nog altijd verschillende atributen op zetten dus dan heeft elk wapen abstacte superklasse een collectie met ectra onderdelen die dan een locatie op het hoofd object hebben met afzonderlijk een paint.
 
Het is me uiteindelijk gelukt! :)

Heb een wapen gemaakt (constructor) en die dan met een paremeter meegegeven, en zo kon ik zonder problemen aan elke functie :)
 
Aah dat is leuk om te horen dat het gelukt is.

Veel succes verder :)
 
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();
        }
    }

}
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan