2017-10-07 1 views
0

In meinem Code habe ich eine Super-Klasse namens Game und ihre Unterklasse Tower. Tower hat auch seine Unterklasse Catapult. Die Catapult Unterklasse sieht wie folgt aus:Ich kann das Objekt nicht in meiner Array-Liste erhalten

public class Catapult extends Tower { 
    public Catapult(){ 
     super(5,3); 
    } 
} 

Es ruft Tower Konstruktor mit konstanten ganzzahligen Werte 5 und 3. Dann seine Super Tower wie folgt aussieht:

public class Tower extends Game { 
    private int damage; 
    private int timeStep; 
    private int position; 
    private boolean willFire; 

    public Tower(int damage, int timeStep){ 
     super.addTower(damage,timeStep); 
    } 
    public Tower(int damage, int timeStep, int position,boolean willFire){ 
     this.damage = damage; 
     this.timeStep = timeStep; 
     this.position = position; 
     this.willFire = willFire; 
    } 
    public void getDamage(){ 
     super.printDamage(); 
    } 

} 

So, jetzt die Werte für die mit Schaden und Zeitschritt (5 und 3), Tower ruft seine super-Konstruktor (Spiel):

import java.util.ArrayList; 
public class Game { 
    private ArrayList<Enemy> enemies = new ArrayList<Enemy>(); 
    private ArrayList<Tower> towers = new ArrayList<Tower>(); 
    private int corridorLength; 
    private int currentPosition = 0; 

    public Game(){} 

    public Game(int corridorLength){ 
     this.corridorLength = corridorLength; 
    } 

    public void addTower(int damage,int timeStep){ 
     this.towers.add(new Tower(damage,timeStep,this.currentPosition,true)); 
    // Add tower with current position corrdor length 
     System.out.println("Tower added in addTower!");} 

    public void printDamage(){ 
     System.out.println(this.towers.get(this.currentPosition)); // How to get the damage item? 
    } 
} 

So das Objekt Tower mit seinen Werten wird im Array Tower gespeichert (zumindest gehe ich davon aus). Also, mit einem nicht leeren Array namens Türme mit mindestens Größe 1, habe ich hier einige Probleme. Erstens: Wenn ich Tower.getDamage() Methode aufrufen, ruft es schließlich die Methode in der Game Klasse, die nur das Objekt Tower bei Index 0 druckt. Aber wenn ich es anders herum, wie Drucken des Objekts innerhalb der Game Klasse versuchen möchte direkt aus der Game Klasse aufrufen, anstatt durch seine Tower Unterklasse des Aufrufs):

public void getDamage(){ 
    System.out.println(this.towers.get(this.currentPosition)); 
} 

Es hat eine außerhalb des zulässigen Bereichs Array Ausnahme auslöst, die ich nicht bekommen, da die Array-Türme ein Objekt im Index gespeichert haben sollte 0.

Zweitens: Wie kann ich die tatsächliche Ganzzahl innerhalb des Objekts erhalten t (Turm) bei Index 0? Also, ich kann so nicht tun:

this.towers.get(0).damage 
+8

Auf einen kurzen Blick auf Ihren Code, sehe ich, dass Sie scheinen Vererbung in großem Umfang missbrauchen. Warum sollte Tower Game verlängern? Macht keinen Sinn, denn wie kann Tower ein spezieller Untertyp des Spiels sein? –

+0

Tower ist ein Objekt im Spiel. Wenn ich Objekt sage, meine ich wie einfaches Objekt (Auto und Motorrad sind beide Objekte des Fahrzeugs). –

+0

Auch Tower wird nicht zum Tower-Feld auf Bau hinzugefügt. Tatsächlich erstellt jeder 'neue Turm()' ein neues 'Spiel' mit einer leeren Turmliste. –

Antwort

0

Wenn Sie den Turm der Schaden ausdrucken möchten, haben Sie .damage am Ende zu nennen, da sonst das Programm will den Turm anstelle des Schadens drucken.

+0

Ja, das war mein erster Gedanke, aber meine IDE sagt, es ist ein Fehler –

+0

Ja, weil 'Schaden' ein ** privater ** Wert ist.Entweder Sie machen es zugänglich (in diesem Fall "öffentlich") oder Sie stellen eine Getter-Methode für den Zugriff bereit (vorzuziehen). – Zabuza

0

Sie können nicht direkt auf die Felder zugreifen, da sie privat sind. Sie sollten Getter für jedes Feld bereitstellen, auf das Sie zugreifen möchten.

+0

Ja, danke. Was ist mit der ersten Frage? Das stört mich sehr. –

+0

Sind Sie sicher, dass Sie einen Turm hinzugefügt haben, bevor Sie die Methode zum Drucken des ersten Turms aufgerufen haben? – NiVeR

+0

Ja, ich habe das erste Objekt-Spiel als eine Instanz von Game initialisiert, dann habe ich eine neue Catapult-Instanz initialisiert, von der ich glaube, dass sie Tower basierend auf meinem Code initialisieren wird. Dann habe ich versucht, "game.getDamage();" zu drucken, was mir einen Fehler zurückgegeben hat. Der Text "Tower in addTower hinzugefügt!" wurde gegeben –

1

Ihre Hauptfrage scheint zu sein, dass Sie die Tower Objekte aus der Game Klasse verwenden möchten. Ein Problem besteht darin, dass Sie die Vererbung falsch verwenden, auf die ich später eingehen werde. Ein anderes, wichtigeres Problem betrifft das Erstellen von Objekten. Sie richtig ein ArrayList Objekt mit

private ArrayList<Tower> towers = new ArrayList<Tower>(); 

jedoch erstellen, die Sie nie irgendwelche Tower Objekte erstellen. Ein Weg, um sicherzustellen, dass Sie einige Tower Objekte haben, ist sie in den Konstruktor erstellen und fügen Sie sie in die Liste:

public Game(int corridorLength){ 
    this.corridorLength = corridorLength; 

    this.towers.add(new Tower()); 
} 

Wenn Sie mehr als ein Turm hinzufügen möchten, haben Sie wahrscheinlich so mit einer for-Schleife tun sollten . Ich überlasse die Details dem Leser als Übung.

Jetzt haben Sie ein Turmobjekt in Ihrer Liste (oder mehr als einer), aber das Feld damage ist privat.Um darauf zuzugreifen, sollten Sie eine „Getter“ Methode, um Ihre Tower Klasse hinzufügen:

public int getDamage() { 
    return damage; 
} 

Jetzt können Sie einen Turm aus der Liste erhalten:

Tower t = towers.get(0); 

und seinen Schadenswert erhalten:

int damage = t.getDamage(); 

Hinweis über die Vererbung

Es scheint mir, dass Sie verwirrt sind, wie Vererbung zu verwenden ist. Vererbung wird üblicherweise als "ist eine" Beziehung bezeichnet. Stellen Sie sich eine einfache Frage: Ist ein Turm ein Spiel? Wenn die Antwort "Ja" ist, dann könnte die Vererbung angemessen sein. Wenn die Antwort "Nein" lautet, ist Vererbung definitiv nicht angemessen.

In diesem Fall scheint mir, dass ein Turm nicht ein Spiel ist. Auf der anderen Seite hat ein Spiel einen Tower. Dies deutet darauf hin, dass die Game Klasse ein Tower Membervariable (oder Feld) enthalten soll:

public class Game { 
    private Tower tower; 
} 

ähnlich ist ein Turm einen Catapult hat, so dass die Tower Klasse soll ein Catapult Mitglied Feld enthält. Da weder ein Tower noch ein Catapult ein Game ist, sollten diese Klassen nicht verlängern Game. Entfernen Sie die extends Game Klauseln aus beiden Klassen.

+0

Das Spiel hat bereits ein Mitglied namens Türme. Wenn Sie sehen können, enthält die ArrayList mehrere Tower-Objekte. Also 1 Spiel wird mehrere Türme haben. Auch für das Catapult denke ich, dass es eher eine "ist-a" -Beziehung ist, da Tower verschiedene Typen haben wird. –

+0

Diese Antwort scheint die OP-Fragen nicht anzusprechen, sie versucht andere nicht zusammenhängende Probleme zu lösen. Für das, was wir jetzt Spiel und Turm können "A" und "B" sein. – NiVeR

+0

@NiVeR Ich habe meine Antwort bearbeitet, um die Kernfrage des OP zu beantworten. –

Verwandte Themen