Announcement

Collapse
No announcement yet.

Modelierungsfrage OOP

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Modelierungsfrage OOP

    hi,

    ich stehe momentan vor einem kniffligen problem. Das ergebnis soll später einmal ein spiel werden. sinn des spieles ist, türme zu bauen, die unterschiedliche fähigkeiten haben, und auf gegner schießen.

    also hab ich mich dran gemacht und erstmal eine abstrakte klasse Tower vorbereitet, die alle Türme abdeckt.

    Extrem vereinfachtes Beispiel, um das wesentliche zu verdeutlichen:

    Code:
    public abstract class Tower {
    
    	// Attributes
    	private byte maxRangeLevel;
    	private byte currentRangeLevel;
    	private int[] position; 
    
    	// Constructor
    	public Tower(byte pMaxRangeLevel) {
    		this.maxRangeLevel = pMaxRangeLevel;
    	}
    
    	// Getter
    	public int getRangeLevel() {
    		return currentRangeLevel;
    	}
    	
    	abstract int getRangeValue();
    
    	public int[] getPosition() {
    
    		return this.position;
    	}
    
    	// Methods
    	public boolean upgradeRangeLevel() {
    
    		if (this.currentRangeLevel < this.maxRangeLevel) {
    			this.currentRangeLevel++;
    			return true;
    		}
    		return false;
    	}
    }
    Code:
    public class LaserTower extends Tower {
    	
    	public static final int RANGES[] = {100, 150, 250, 300, 500}; //range für level x
    	puvilc static final byte MAX_RANGE_LEVEL = 5;	
    	public Laser() {
    		super(MAX_RANGE_LEVEL);
    	}
    
    	@Override
    	int getRangeValue() {
    		return ranges[this.getRangeLevel()-1];
    	}
    	
    }
    der grund wieso ich jetzt RANGES statisch in die klasse LaserTower gesetzt habe, ist, dass ich nicht die ganzen arrays jedem objekt übergeben will. das wäre speicherplatzverschwendung. es reicht ja im prinzip, die nur einmal für jede unterklasse zu definieren.
    was mir daran aber nicht gefällt ist, das ich die funktion getRangeValue in jeder Tower-UnterKlasse neu implementieren muss, und zwar immer mit dem selben code! die methode in der klasse Tower zu definieren bringt wieder das problem, das ich dann dort überprüfen muss, zu welcher turm-klasse das einzelne objekt gehört und das würde bedeuten, ich müsste bei jeder neuen tower-unterklasse die klasse Tower anpassen, was natürlich auch nicht der sinn der sache ist.


    wie würdet ihr das designen? profesionelle meinungen?

  • #2
    getRangeValue

    Auf einen ertsne schnellen Blick würde ich getRangeValue() nicht abstract defnieren. Dann musst Du natürlich eine Überschreibung in Unterklassen vornehmen.

    Aber eine Implementierung der Oberklasse kannst Du trotzdem in Unterklassen überschreiben, wenn erforderlich. Sollte das immer gemacht werden müssen, kann die Implementierung eine Exception werden, um den "Fehler" bekannt zu geben.
    public int getRangeValue() {
    throw new IllegalArgumentException("getRangeValue() der Oberklasse aufgerufen");
    }

    Comment

    Working...
    X