Modellierung, vererbung,

Hallo zusammen,
ich soll einen ContainerTerminal modellieren. Dieser besteht insgesamt aus Containerstapeln und einem Kran, der Stapel wiederum aus 2 Arten von Container (mit ihren Eigenschaften / Vererbung) . Ich hab glaub ich soweit alles in den Bausteinen umgesetzt, aber mir ist beim Kran und dem Stappel nicht klar, wie diese interagieren sollen.

Die Aufgabe sagt mir :
"Ein Containerstapel besteht aus keinem, einem, oder mehreren Containern und es ist egal wie viele Stappel es gibt bzw erzeugt werden". Aber mich verwirrt jetzt der Kran, denn der soll :
Mit Hilfe des Krans können Container von einem Ursprungsstapel zu einem Zielstapel bewegt werden. Wichtig ist, dass der Kran nur Containertransporte durchzuführen kann, die im Rahmen seiner Fähigkeiten liegen, d.h. unter Beachtung der maximalen Traglast und Hubhöhe. Auch ist der Kran nicht fähig, mehrere Container gleichzeitig zu transportieren. Der Containertransport geschieht in vier Schritten:
1. Positioniere Kran vor Ursprungsstapel
2. Entnehme obersten Container („pick“)
3. Positioniere Kran vor Zielstapel
4. Lege zuvor aufgenommenen Container zuoberst ab („place“)

Das alles klingt doch sehr nach einem Stack oder ? Ich bin im Moment soweit, dass ich das habe :
Code:
import java.util.ArrayList;
import java.util.List;

public class Stack<Container> {

    private int containerStackID;
    private static int firstContainerID = 0;
    private final List<Container> stackElements;

    public void createContainerStackID() {
        containerStackID = ++firstContainerID;
    }

    public int getContainerStackID() {
        return containerStackID;
    }

    public Stack() {
        createContainerStackID();
        stackElements = new ArrayList<>();
    }

    public void push(Container element) {
        stackElements.add(element);
    }

    public boolean isEmpty() {
        return stackElements.isEmpty();
    }

    public Container pop() {
        if (isEmpty()) {
            throw new EmptyStackException("Der Stack ist leer!");
        } else {
            int lastIndex = stackElements.size() - 1;
            Container lastElement = stackElements.get(lastIndex);
            stackElements.remove(lastIndex);
            return lastElement;
        }
    }

    @Override
    public String toString() {
        return "Stack [stackElements=" + stackElements + "]+ conatainerStackID ";
    }

    public void clear() {
        stackElements.clear();
    }

}
Hier dachte ich, dass es sich um den Containerstappel handelt, aber kann es sein, dass ich die Klasse gar nicht brauche, da der Kran diese ganzen Methoden braucht?

hier noch der Kran :
Code:
public class Kran {
    
    private Container40ft container40ft;
    private Container40ftHC container40ftHC;
    private static final int maxHeight = 2438; // 160 Fuß entsprechen 2438,4 cm
    private static final int maxloadCapacity = 30; // Tonnen

    public static int getMaxheight() {
        return maxHeight;
    }

    public static int getMaxloadcapacity() {
        return maxloadCapacity;
    }

}
 
dass der Kran nur Containertransporte durchzuführen kann, die im Rahmen seiner Fähigkeiten liegen, d.h. unter Beachtung der maximalen Traglast und Hubhöhe
Da es paar verschiedene Krans gibt, welche sich in Hubhöhe, Reichweite und Kraft unterscheiden, gilt es, diese Eigenschaften dem jeweiligen Kran zu "geben".
Eine Möglichkeit wäre es, ein Interface Kran mit Methoden wie
  • maxLiftPower() : double
  • maxLiftHight() : double
  • maxReach() : double
einzuführen und dann jede implementierende Klasse hart-codieren, wie du es bereits bei deinem Kran gemacht hast. Hat den Vorteil, dass jeweilige Klasse nur für sich geändert werden kann.
Java:
interface Crane
{
   public double maxLiftPower();
   public double maxLiftHight();
   public double maxReach();
}

class LittleCrane implements Crane
{
    private final double liftPower = 10;
    private final double liftHight = 10;
    private final double maxReach = 10;
   
    public double maxLiftPower()
    {
        return this.liftPower;
    }
    public double maxLiftHight()
    {
        return this.liftHight;
    }
    public double maxReach()
    {
        return this.maxReach;
    }

}
Man kann aber auch eine Klasse Kran erstellen, dabei ist eben die Gefahr vorhanden, dass falsche Werte an ein Kran übergeben werden können.
Java:
class Crane
{
    private final double liftPower;
    private final double liftHight ;
    private final double maxReach;

    Crane(double lift, double hight, double power)
    {
          //Werte übertragen
    }

    public double maxLiftPower()
    {
        return this.liftPower;
    }
    public double maxLiftHight()
    {
        return this.liftHight;
    }
    public double maxReach()
    {
        return this.maxReach;
    }
}
 
Da es paar verschiedene Krans gibt, welche sich in Hubhöhe, Reichweite und Kraft unterscheiden, gilt es, diese Eigenschaften dem jeweiligen Kran zu "geben".
Eine Möglichkeit wäre es, ein Interface Kran mit Methoden wie
  • maxLiftPower() : double
  • maxLiftHight() : double
  • maxReach() : double
einzuführen und dann jede implementierende Klasse hart-codieren, wie du es bereits bei deinem Kran gemacht hast. Hat den Vorteil, dass jeweilige Klasse nur für sich geändert werden kann.
Java:
interface Crane
{
   public double maxLiftPower();
   public double maxLiftHight();
   public double maxReach();
}

class LittleCrane implements Crane
{
    private final double liftPower = 10;
    private final double liftHight = 10;
    private final double maxReach = 10;
  
    public double maxLiftPower()
    {
        return this.liftPower;
    }
    public double maxLiftHight()
    {
        return this.liftHight;
    }
    public double maxReach()
    {
        return this.maxReach;
    }

}
Man kann aber auch eine Klasse Kran erstellen, dabei ist eben die Gefahr vorhanden, dass falsche Werte an ein Kran übergeben werden können.
Java:
class Crane
{
    private final double liftPower;
    private final double liftHight ;
    private final double maxReach;

    Crane(double lift, double hight, double power)
    {
          //Werte übertragen
    }

    public double maxLiftPower()
    {
        return this.liftPower;
    }
    public double maxLiftHight()
    {
        return this.liftHight;
    }
    public double maxReach()
    {
        return this.maxReach;
    }
}
in der Aufgabe wird festgelegt, dass es nur einen Kran gibt und er hat die Fähigkeit entweder die Container vom Ursprungsstapel zu nehmen und zu einem Zielstappel zu bringen, aber wie leg ich das fest bzw wie setz ich diese Vorgaben um? Brauche ich eine Stappelklasse für die Container?(wenn ja welche datenstruktur nutzt sie und wie sieht sie aus) und vor allem wie setz ich es um, dass ich dem Kran 2 integer mitgebe und er automatisch, weiß, dass sich der erste Integerwert auf stappel 1 bezieht und der 2. wert eben auf den anderen Stappel ?
 
Stack ist das englische Wort für Stapel :)
Damit wollte ich eigentlich erfragen, ob ich einen Stack als Datenstruktur nutzen sollte oder eben nicht, Wenn nicht, was dann ?

Mit Hilfe einer Methode, z. B. void transportContainer(Stapel origin, Stapel destination).
Aber wie sollte denn die Stappelklasse aussehen? Ist meine Umsetzung oben gut oder nicht gut. Ich hab ja im Prinzip nur quasi einen Stack für Container geschrieben oder nicht? Brauche ich jetzt noch zusätzlich eine Klasse mit Konstruktor für die Containerstappel
 
Nachtrag: wie ich gerade lese, wird es die Methode so nicht geben, da die Transportschritte einzeln durchzuführen sind.
 
Nachtrag: wie ich gerade lese, wird es die Methode so nicht geben, da die Transportschritte einzeln durchzuführen sind.
Muss soweit ich weiß nicht, es gilt nur die Bedingungen zu beachten, dass der zu transportierende Container nicht schwerere als die Traglast des Krans ist und dass der Stapel nicht die Höhe des Krans überschreitet. Also müsste es doch so irgendwie aussehen oder ?
Java:
public class Kran {

    private Container40ft container40ft;
    private Container40ftHC container40ftHC;
    private static final int maxHeight = 2438; // 160 Fuß entsprechen 2438,4 cm
    private static final int maxloadCapacity = 30;

    public static int getMaxheight() {
        return maxHeight;
    }

    public static int getMaxloadcapacity() {
        return maxloadCapacity;
    }

    public static void transportContainer(Stack<Container> origin, Stack<Container> destination) {
        if (Kran.getMaxloadcapacity() > origin.getContainer.getWeight()) {
            Container origin = pop();
            destination.push(origin);
        }
    }

}
 
Aber es bleibt immernoch die Frage wie ich die Containerstappelklasse implementiere, denn ich muss ja irgendwie an die Container kommen, um Zugriff auf deren Gewicht zu kriegen, aber wie mach ich das ?
 
Muss soweit ich weiß nicht, es gilt nur die Bedingungen zu beachten, dass der zu transportierende Container nicht schwerere als die Traglast des Krans ist und dass der Stapel nicht die Höhe des Krans überschreitet.
Das musst Du wissen. Ich habe nur gelesen:
Der Containertransport geschieht in vier Schritten:
Also, jetzt gehen wir mal zurück auf Anfang - ohne Code. Wie sieht denn Dein Modell im Diagramm aus?
 
Aber es bleibt immernoch die Frage wie ich die Containerstappelklasse implementiere, denn ich muss ja irgendwie an die Container kommen, um Zugriff auf deren Gewicht zu kriegen, aber wie mach ich das ?
Grob soll der Stapel der Aufgabe nach so aussehen:

Java:
public class Stapel {
 
    public Container pick() {
     
    }
 
    public void place(Container container) {
     
    }
}
Edit:

"pick()" und "place()" könnten allerdings auch Methoden des Kranes sein. Die Aufgabe, wie oben beschrieben, lässt es offen, wie die Methoden des Stapels heißen, um den obersten Container zu entfernen, bzw. hinzuzufügen.
 
Zuletzt bearbeitet:
Das musst Du wissen. Ich habe nur gelesen:


Also, jetzt gehen wir mal zurück auf Anfang - ohne Code. Wie sieht denn Dein Modell im Diagramm aus?
Also die Modellierung ist eigentlich relativ simple :
Ein Container-Terminal besitzt genau einen fahrbaren Kran sowie einen oder mehrere
Containerstapel. Containerstapel sind beginnend mit 0 fortlaufend nummeriert; Integer genügt,
um die Stapelnummern darzustellen. Ein Containerstapel besteht aus keinem, einem, oder mehreren
Containern.
Für die Container gilt :
Man unterscheidet zwei Arten von Containern: 40-Fuß-Container (Kurzschreibweise: 40ft) sowie 40-Fuß-High-Cube-Container ( Kurzschreibweise: 40ftHC). Dabei bezeichnet 40 Fuß1 die Länge der Container. „High Cube“-Container sind höher im Vergleich zu regulären 40-Fuß-Containern. Erstere haben eine Höhe von 9 Fuß und 6 Zoll, letztere haben eine Höhe von nur 8
Fuß und 6 Zoll. Ein Container in unserem vereinfachten Modell besitzt neben seinem Typ folgende Eigenschaften: Länge, Höhe, Gewicht, sowie eine eindeutige Identifizierungsnummer. Das Gewicht beinhaltet das Eigengewicht des Containers sowie die im Container enthaltene Fracht. Breite und weitere Eigenschaften sollen vernachlässigt werden.

Ich denk mal bei den Containern kann man nicht viel falsch machen. Ich hab eine allgemeine Container Klasse und lasse die beiden speziellen Arten davon erben und statte sie mit einem Konstruktor jeweils aus, der ihnen eine int und ein gewicht mitgibt
 
Grob soll der Stapel der Aufgabe nach so aussehen:

Java:
public class Stapel {

    public Container pick() {
    
    }

    public void place(Container container) {
    
    }
}
Edit:

"pick()" und "place()" könnten allerdings auch Methoden des Kranes sein. Die Aufgabe, wie oben beschrieben, lässt es offen, wie die Methoden des Stapels heißen, um den obersten Container zu entfernen, bzw. hinzuzufügen.
Braucht die ganze Klasse den Stack oder erstellt sich der Stack immer nur im Konstruktor bzw in lokalen Methoden?
 
Grob soll der Stapel der Aufgabe nach so aussehen:

Java:
public class Stapel {

    public Container pick() {
    
    }

    public void place(Container container) {
    
    }
}
Edit:

"pick()" und "place()" könnten allerdings auch Methoden des Kranes sein. Die Aufgabe, wie oben beschrieben, lässt es offen, wie die Methoden des Stapels heißen, um den obersten Container zu entfernen, bzw. hinzuzufügen.
Weil beim placen der Container muss der Container ja durch irgendeine Datenstruktur gespeichert werden und das ist ja dann der Stack ?
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben