Instanzvariablen, Veerbung, Konstruktor

Louis12

Aktives Mitglied
Hallo Leute,

und zwar komme ich einfach nicht auf die Idee wie ich das umsetzen soll es geht um,
eine Instanzvariable die sich in einer Superklasse befindet die anschließend in einer Subklasse nicht als Parameter übergeben wird, sondern als Rechnung z.B. , wenn ein gewicht (packet) kleiner als eine bestimmte grammanzahl ist dann soll man eine bestimmten preis in cents zahlen (Gebühr).

Vielen Dank & LG,
louis
 
eine Instanzvariable die sich in einer Superklasse befindet die anschließend in einer Subklasse nicht als Parameter übergeben wird, sondern als Rechnung
Das Problem bei diesem Satz ist, dass er am Anfang einigermaßen verständlich/interpretierbar ist und Begriffe aus der objektorientierte Programmierung verwendet wurden, bis zum Wort... 'Rechnung'.
Es soll also kein Parameter sein, sondern eine Rechnung? Was versteht man in OOP/Java unter einer Rechnung??
Kannst du das Problem vielleicht ohne Domänensprache vormulieren?
 
Hallo,

Ich hoffe das ist verständlicher. Es geht um einen Wert einer der Instanzvariable postage die nicht als Parameter übergeben wird, sondern wie folgt berechnet Ist das Gewicht z.B. (weight) kleiner als eine x anzahl an kg (0.2), fallen 70ct Porto an.

Ich hoffe das ist verständlicher
Liebe Grüße
louis
 
Und woher kommen (tatsächliches) Gewicht und der Gewicht-Grenzwert 'x' = 0.2kg?
Hört sich so an, als wären das alles einfach lokale Variablen in einer Methode, die einfach auszurechnen sind.
Schreib doch mal hin, was du schon an Code hast und wie generell dein Design aussieht.
 
jo Das ist die Oberklasse von der geerbt werden soll. Hier befindet sich ebenfalss die Instanzvariable Postage. In der nächsten Antwort füge ich den Code hinzu der erbt.

package de.tuberlin.mcc.prog1.logistics.deliveries;
import de.tuberlin.mcc.prog1.logistics.Location;
public class Delivery { // etwa package oder public

/**
* Delivery speed.
*/
static final int SPEED = 1000;
/**
* Sender of Delivery.
*/
private Location sender;

/**
* Receiver of delivery.
*/
private Location receiver;

/**
* Time of creation.
*/
private long date = System.currentTimeMillis();

/**
* Weight of delivery.
*/
private final double weight;

/**
* Portogebühr
*/
/*private*/ public int postage; // hier noch unsicher, denke aber als Privat

/**
* Returns the receiver of delivery
* @Return receiver of delivery
*/

public int getPostage() {

return postage;
}

public Location getReceiver() {
return receiver;
}

/**
* Updates the receiver of delivery
* @param receiver - new receiver
*/
public void setReceiver(Location receiver) {
if (receiver != null) {
this.receiver = receiver;
System.out.println("Updated receiver to " + receiver.getName());
}
}

/**
* Returns the weight of delivery
* @Return weight of delivery
*/
public double getWeight() {
return weight;
}

/**
* Returns the sender of delivery
* @Return sender of delivery
*/
public Location getSender() {
return sender;
}

/**
* Returns the creation time of delivery
* @Return creation time of delivery
*/
public long getDate() {
return date;
}

/**
* Creates a delivery
* @param sender - sender of delivery
* @param receiver - receiver of delivery
* @param weight - weight of delivery
*/
protected Delivery(Location sender, Location receiver, double weight) {
this.sender = sender;
this.receiver = receiver;
this.date = System.currentTimeMillis();
this.weight = weight;
}

/**
* Returns the estimated delivery time
* @Return estimated delivery time
*/
public long getEstimatedDeliveryTime() {
return this.date + getEstimatedDeliveryPeriod();
}

@Override
public String toString() {
long time = getEstimatedDeliveryTime() - System.currentTimeMillis();
if (time < 0) {
time = 0;
}
return "from " + sender.getName() + " to " + receiver.getName()
+ ", " + weight + "kg, arrival in " + time + "ms";
}

/**
* Calculates the estimated delivery period in ms
* @Return delivery period in ms
*/
private long getEstimatedDeliveryPeriod() {
return (long) getDistance() * SPEED;
}

/**
* Calculates the distance between sender and receiver.
* @Return distance between sender and receiver
*/
private double getDistance() {
int xdiff = sender.getxPosition() - receiver.getxPosition();
xdiff = Math.abs(xdiff);
int ydiff = sender.getyPosition() - receiver.getyPosition();
ydiff = Math.abs(ydiff);
return Math.sqrt(xdiff * xdiff + ydiff * ydiff);

}

}
 
package de.tuberlin.mcc.prog1.logistics.deliveries;
import de.tuberlin.mcc.prog1.logistics.Location;
public class Letter extends Delivery {
private final boolean registeredLetter; // oder public ?
public Letter(Location sender, Location receiver, double weight,boolean registeredLetter) {
super(sender, receiver, weight);
this.registeredLetter = registeredLetter;

if (weight < 0.2) {
getPostage(); // 70ct evt den wert von getpostage *7
}
else if(weight <0.51 && weight > 0.199 ) {
getPostage(); // 200ct
}
else if(weight > 0.49) {
getPostage(); // 400ct
}

if(registeredLetter = true) {
getPostage(); //"400ct"

}

if(registeredLetter = false){
getPostage(); // +0 ct
}



}
@Override
public String toString() {
return "Letter [registeredLetter=" + registeredLetter + "]";
}

}
 
Ach so... na du kannst doch im Konstruktor von Delivery einfach den Wert von postage berechnen. Du hast da ja alle nötigen Werte. getPostage() brauchst du nicht aufzurufen und macht, so wie du es aktuell machst, auch überhaupt keinen Sinn - also diese Aufrufe des Getters in der Luft.
Setze einfach den Wert von postage im Konstruktor für den jeweiligen Fall und gut ist.
Übrigens, die Instanzvariable postage kannst du "protected" markieren.
 
vielen Dank!!!
ich habe es jetzt genauso gemacht allerdings frage ich mich ob ich es auch in den Konstruktor von Letter hinein schreiben könnte, weil dort sich eine Instanzvariable registeredLetter vom Typ boolean befindet, die 300 cent mehr zuschlag fördern soll wenn sie true ist (ich habe die if bedingung von registeredLetter in der Klasse Letter geschrieben).
 
Zuletzt bearbeitet:
hmmmm leider weiß ich nicht genau aber ich glaube ich schreibe es evt. in Letter ergänzend mit super.postage hin.
Genau. Das Porto einer Delivery kann nicht sinnvoll berechnet werden, weil es (unter anderem) abhängig davon ist, ob es sich um einen Letter, ein Parcel, ... handelt. Bei einem Brief spielen für die Berechnung ganz andere Gewichte eine Rolle, wie bei einem Paket usw.
 
Hallo Leute,
In meiner Aufgabe gibt es etwas, was verstehe ich nicht verstehe könnt ihr bitte mir wieder auf die Sprünge helfen und zwar
soll ich eine Klassenmethode namens createLetterFromUserInput() ergänzen , welche eine Instanz vom Typ Letter zurückgibt, nachdem sie deren Eigenschaften von der Konsole eingelesen hat. Ein...

Ich weiß als erstes nicht warum und welche Instanz ich zurück geben soll. Ich denke, aber das die Werte von weight usw eingelsen werden sollen mithilfe der IOTools.
Java:
public static Letter  createLetterFromUserInput() {

Letter(Location sender, Location receiver, double weight,boolean registeredLetter) //Die Werte

// IOTools.reasLetter("LocationID of sender");                                // Die einlesung
// IOTools.readLetter("LocationID of receiver");
//IOTools.readLetter
usw.

}



public static Location getLocationById(int id) // hier wurden auch werte einer anderen Klasse benutzt


Java:
package de.tuberlin.mcc.prog1.logistics;

public class DeliveryManager {
   
    /**
     * Registered deliveries
     */
    Delivery[] deliveries = new Delivery[0];
    /**
     * Available locations
     */
    static Location[] locations =  LogisticsManager.locations;
   
    /**
     * Registers given deliveries
     * @param deliveries - deliveries to register
     */
    public void registerDeliveries(Delivery... deliveries) {
        if (deliveries == null || deliveries.length == 0) {
            return;
        }
        Delivery[] oldDeliveries = this.deliveries;
        Delivery[] newDeliveries = new Delivery[oldDeliveries.length + deliveries.length];
       
        for (int i = 0; i < newDeliveries.length; i++) {
            if (i < oldDeliveries.length) {
                newDeliveries[i] = oldDeliveries[i];
            } else {
                newDeliveries[i] = deliveries[i-oldDeliveries.length];
            }
        }
        this.deliveries = newDeliveries;
    }
   
    /**
     * Updates the receiver of a delivery by location id.
     * @param index - Index position of delivery
     * @param locationId - Id of location
     */
    public void setReceiverForDelivery(int index, int locationId) {
        if (index >= 0 && index < deliveries.length) {
            Location receiver = getLocationById(locationId);
            if (receiver != null) deliveries[index].setReceiver(receiver);
        }
    }
   
    /**
     * Searches in Location[] locations (see above) for a location with given ID.
     * @param id - Id of location to look up
     * @return location with given id or null if there is no such location
     */
    public static Location getLocationById(int id) {
        for (Location l : locations) {
            if (l != null && l.getId() == id) {
                return l;
            }
        }
        return null;
    }
   
    /**
     * Prints all registered deliveries.
     */
    public void printDeliveries() {
        System.out.println("Registered Deliveries:");
        for (int i = 0; i < deliveries.length; i++) {
            if (deliveries[i] != null) {
                System.out.println("[" + i + "]: " + deliveries[i].toString());
            }
        }
    }

}
 
Kann man Variabeln vom Typ Letter einlesen ? , bei Primitiven Datentypen geht das aber bei Komplexen wweiß ich es nicht.

Ich habe es folgendermaßen versucht
Code:
 Location    id = IOTools.readLong("LocationID of sender: ");
  
id =  getSender();

    if(/*alle eingaben richtig*/) {
        Letter Objekt = new Letter(sender, receiver, weight, registeredLetter);
    }
    else {
        System.out.println("Fehlermeldug ");
    }
    return Objekt; //
 
jo Das ist die Oberklasse von der geerbt werden soll. Hier befindet sich ebenfalss die Instanzvariable Postage. In der nächsten Antwort füge ich den Code hinzu der erbt.








Code:
/**
* Delivery speed.
*/
static final int SPEED = 1000;
/**
* Sender of Delivery.
*/
private Location sender;

/**
* Receiver of delivery.
*/
private Location receiver;

/**
* Time of creation.
*/
private long date = System.currentTimeMillis();

/**
* Weight of delivery.
*/
private final double weight;

/**
* Portogebühr
*/
/*private*/ public int postage; // hier noch unsicher, denke aber als Privat

/**
* Returns the receiver of delivery
* @Return receiver of delivery
*/

public int getPostage() {

return postage;
}

public Location getReceiver() {
return receiver;
}

/**
* Updates the receiver of delivery
* @param receiver - new receiver
*/
public void setReceiver(Location receiver) {
if (receiver != null) {
this.receiver = receiver;
System.out.println("Updated receiver to " + receiver.getName());
}
}

/**
* Returns the weight of delivery
* @Return weight of delivery
*/
public double getWeight() {
return weight;
}

/**
* Returns the sender of delivery
* @Return sender of delivery
*/
public Location getSender() {
return sender;
}

/**
* Returns the creation time of delivery
* @Return creation time of delivery
*/
public long getDate() {
return date;
}

/**
* Creates a delivery
* @param sender - sender of delivery
* @param receiver - receiver of delivery
* @param weight - weight of delivery
*/
protected Delivery(Location sender, Location receiver, double weight) {
this.sender = sender;
this.receiver = receiver;
this.date = System.currentTimeMillis();
this.weight = weight;
}

/**
* Returns the estimated delivery time
* @Return estimated delivery time
*/
public long getEstimatedDeliveryTime() {
return this.date + getEstimatedDeliveryPeriod();
}

@Override
public String toString() {
long time = getEstimatedDeliveryTime() - System.currentTimeMillis();
if (time < 0) {
time = 0;
}
return "from " + sender.getName() + " to " + receiver.getName()
+ ", " + weight + "kg, arrival in " + time + "ms";
}

/**
* Calculates the estimated delivery period in ms
* @Return delivery period in ms
*/
private long getEstimatedDeliveryPeriod() {
return (long) getDistance() * SPEED;
}

/**
* Calculates the distance between sender and receiver.
* @Return distance between sender and receiver
*/
private double getDistance() {
int xdiff = sender.getxPosition() - receiver.getxPosition();
xdiff = Math.abs(xdiff);
int ydiff = sender.getyPosition() - receiver.getyPosition();
ydiff = Math.abs(ydiff);
return Math.sqrt(xdiff * xdiff + ydiff * ydiff);

}

}



Code:
package de.tuberlin.mcc.prog1.logistics.deliveries;
import de.tuberlin.mcc.prog1.logistics.Location;
public class Letter extends Delivery {
private final boolean registeredLetter; // oder public ?
public Letter(Location sender, Location receiver, double weight,boolean registeredLetter) {
super(sender, receiver, weight);
this.registeredLetter = registeredLetter;

if (weight < 0.2) {
getPostage(); // 70ct evt den wert von getpostage *7
}
else if(weight <0.51 && weight > 0.199 ) {
getPostage(); // 200ct
}
else if(weight > 0.49) {
getPostage(); // 400ct
}

if(registeredLetter = true) {
getPostage(); //"400ct"

}

if(registeredLetter = false){
getPostage(); // +0 ct
}



}
@Override
public String toString() {
return "Letter [registeredLetter=" + registeredLetter + "]";
}

}



Hallo Leute,
In meiner Aufgabe gibt es etwas, was verstehe ich nicht verstehe könnt ihr bitte mir wieder auf die Sprünge helfen und zwar
soll ich eine Klassenmethode namens createLetterFromUserInput() ergänzen , welche eine Instanz vom Typ Letter zurückgibt, nachdem sie deren Eigenschaften von der Konsole eingelesen hat. Ein...

Ich weiß als erstes nicht warum und welche Instanz ich zurück geben soll. Ich denke, aber das die Werte von weight usw eingelsen werden sollen mithilfe der IOTools.
Java:
public static Letter  createLetterFromUserInput() {

Letter(Location sender, Location receiver, double weight,boolean registeredLetter) //Die Werte

// IOTools.reasLetter("LocationID of sender");                                // Die einlesung
// IOTools.readLetter("LocationID of receiver");
//IOTools.readLetter
usw.

}



public static Location getLocationById(int id) // hier wurden auch werte einer anderen Klasse benutzt


Java:
package de.tuberlin.mcc.prog1.logistics;

public class DeliveryManager {
 
    /**
     * Registered deliveries
     */
    Delivery[] deliveries = new Delivery[0];
    /**
     * Available locations
     */
    static Location[] locations =  LogisticsManager.locations;
 
    /**
     * Registers given deliveries
     * @param deliveries - deliveries to register
     */
    public void registerDeliveries(Delivery... deliveries) {
        if (deliveries == null || deliveries.length == 0) {
            return;
        }
        Delivery[] oldDeliveries = this.deliveries;
        Delivery[] newDeliveries = new Delivery[oldDeliveries.length + deliveries.length];
      
        for (int i = 0; i < newDeliveries.length; i++) {
            if (i < oldDeliveries.length) {
                newDeliveries[i] = oldDeliveries[i];
            } else {
                newDeliveries[i] = deliveries[i-oldDeliveries.length];
            }
        }
        this.deliveries = newDeliveries;
    }
 
    /**
     * Updates the receiver of a delivery by location id.
     * @param index - Index position of delivery
     * @param locationId - Id of location
     */
    public void setReceiverForDelivery(int index, int locationId) {
        if (index >= 0 && index < deliveries.length) {
            Location receiver = getLocationById(locationId);
            if (receiver != null) deliveries[index].setReceiver(receiver);
        }
    }
 
    /**
     * Searches in Location[] locations (see above) for a location with given ID.
     * @param id - Id of location to look up
     * @return location with given id or null if there is no such location
     */
    public static Location getLocationById(int id) {
        for (Location l : locations) {
            if (l != null && l.getId() == id) {
                return l;
            }
        }
        return null;
    }
 
    /**
     * Prints all registered deliveries.
     */
    public void printDeliveries() {
        System.out.println("Registered Deliveries:");
        for (int i = 0; i < deliveries.length; i++) {
            if (deliveries[i] != null) {
                System.out.println("[" + i + "]: " + deliveries[i].toString());
            }
        }
    }

}




Kann man Variabeln vom Typ Letter einlesen ? , bei Primitiven Datentypen geht das aber bei Komplexen wweiß ich es nicht.

Ich habe es folgendermaßen versucht
Code:
 Location    id = IOTools.readLong("LocationID of sender: ");

id =  getSender();

    if(/*alle eingaben richtig*/) {
        Letter Objekt = new Letter(sender, receiver, weight, registeredLetter);
    }
    else {
        System.out.println("Fehlermeldug ");
    }
    return Objekt; //
 
Nein, Du liest die primitiven Werte wie z. B. Gewicht etc. ein und erzeugst dann ein neues Letter-Objekt.

EDIT:

Ja, das sieht gut aus.


Ja aber wie bekomme ich es hin, dass Letter weiß, um welchen wert es sich handelt denn in der Methode gibt es ja dann if-else Abfragen, man kann ja nicht primitive Datentypen in Location Variablen casten bzw. habe ich es mit getter methoden probiert, leider hat es auch nicht so richtig geklappt.



Code:
public static Letter  createLetterFromUserInput() {
  
  
    //Letter(Location sender, Location receiver, double weight,boolean registeredLetter);
  
//Location    id = IOTools.readLong("LocationID of sender: ");


int  LocationIDs = IOTools.readInt("LocationID of sender"); // braucht man eig. nicht
 int  LocationIDr = IOTools.readInt("LocationID of receiver: "); // ebenfalls nicht
double weight = IOTools.readDouble("Weight of letter: ");
boolean registeredLetter = IOTools.readBoolean("Registered letter?: ");
//Location id = LocationIDr;

//getLocationById();
//Delivery werte = new Delivery(id, id, weight);
//werte.getWeight();
                 





    if(weight >0 && weight < 10 &&  LocationIDs > 0 && LocationIDs < 10 && LocationIDr > 0 && LocationIDr < 10 || registeredLetter == true || registeredLetter == false) {
        Letter Objekt = new Letter(sender, receiver, weight, registeredLetter);
    }
    else {
        return null;
    }
    return Objekt; //

}
 
Zuletzt bearbeitet:
Ja aber wie bekomme ich es hin
Das kommt darauf an, was Du einliest. Wenn Du z. B. die Location-ID einliest, dann lässt Du Dir von Deinem DeliveryManager das dazugehörige Location-Objekt geben.

Java:
int senderId = IOTools.readInt("LocationID of sender");
...
Location sender = DeliveryManager.getLocationById(senderId);
...
... new Letter(sender, receiver, ...);
 
Was sollen denn 10 Zeilenumbrüche nach jedem Block?😕

Dachte das wäre besser so :/


Das kommt darauf an, was Du einliest. Wenn Du z. B. die Location-ID einliest, dann lässt Du Dir von Deinem DeliveryManager das dazugehörige Location-Objekt geben.

Java:
int senderId = IOTools.readInt("LocationID of sender");
...
Location sender = DeliveryManager.getLocationById(senderId);
...
... new Letter(sender, receiver, ...);

Haben die 3 Punkte "...", was mit dem Array zu tun oder heißt das sowas wie usw.
 
Das kommt darauf an, was Du einliest. Wenn Du z. B. die Location-ID einliest, dann lässt Du Dir von Deinem DeliveryManager das dazugehörige Location-Objekt geben.

Java:
int senderId = IOTools.readInt("LocationID of sender");
...
Location sender = DeliveryManager.getLocationById(senderId);
...
... new Letter(sender, receiver, ...);

Dankeschön
Weigth und registerletter brauche ich nur einzulesen und direkt in ein letter Objekt zu erstellen oder ?
 
Das kommt darauf an, was Du einliest. Wenn Du z. B. die Location-ID einliest, dann lässt Du Dir von Deinem DeliveryManager das dazugehörige Location-Objekt geben.

Java:
int senderId = IOTools.readInt("LocationID of sender");
...
Location sender = DeliveryManager.getLocationById(senderId);
...
... new Letter(sender, receiver, ...);

Danke weight und registerletter brauche ich nur einzulesen und dann direkt als Objekt als Objekt zu erstellen oder ? Also


int weight = IOTools.readInt("Gewicht");
......
Letter neu = new Letter (weight.....
Das heißt an der Stelle könnte noch viel mehr Code stehen.... (Platzhalter zeichen)
Danke
 
Achso es geht darum den Briefporto der Briefe sowie die Zustellungszeit zu bestimmen!
Könntest du nochmal alle Vorschriften sauber wiedergeben?
Dann kann ichs machen und dir helfen dabei.
 
Du musst Dir halt anschauen, welche Werte im (bzw. in einem) Letter-Konstruktor erwartet werden. Die musst Du zur Verfügung stellen.
Achso es geht darum den Briefporto der Briefe sowie die Zustellungszeit zu bestimmen!
Könntest du nochmal alle Vorschriften sauber wiedergeben?
Dann kann ichs machen und dir helfen dabei.

Danke für die Hilfe !!!, inzwischen habe ich eine neue Aufgabe bekommen.

lG
louis
 

Zurück
Oben