Hallo, für ein Shopping Cart Programm habe ich die Klassen "Article", "Grocery", "ShoppingCart" und "Item", sowie die main-methode "ShoppingMall". Dort wird ein Objekt der Klasse ShoppingCart übergeben, sodass dort in der Methode "toAdd" die jeweilige Menge hinzugefügt werden kann.
Welchen Nutzen dann haben die Methoden "toAdd" in Grocery und Article?? Ich habe Grundgerüst nach der Angabe aufgebaut wie es sein soll, nur einigie Methoden sind noch nicht ausgefüllt.
Die Angabe nur der Vollständigkeit halber (vorsicht viel Text)
In diesem Beispiel modellieren Sie einen einfachen digitalen Warenkorb ( Klasse ShoppingCart ) eines Online Händlers ( Klasse ShoppingMall ). Der Online Händler vertreibt, der Einfachheit wegen, nur vier verschiedene Artikel die sich in zwei Gruppen aufteilen lassen. 1. Zwei Lebensmittel (Klasse Grocery) nämlich Butter und Milch, diese werden nur in ganzen Packungen verkauft. 2. Zwei „Waren“ ohne Verfallsdatum (Klasse Article), dies sind Draht und Fliesen. Der Draht wird per laufendem Meter ( „lfdm“ ) verkauft wobei auch Bruchteile eines „lfdm“ erhältlich sind. Die Fliesen werden pro Quadratmeter („qm“) verkauft erhältlich in Bruchteilen von „qm“. Die Klassen Article und Grocery enthalten die vom Kunden gewünschte Menge in Grocery dargestellt durch eine Ganzzahl (int) in Article durch eine Gleitkommazahl (float). Um die gekauften Waren in einem Array bzw. „Container“ speichern zu können und bei der Rechnungserstellung bzw. der Ausgabe des Warenkorbes alle Waren gleich behandeln zu können müssen alle Waren- Klassen (Article und Grocery) die gleiche Schnittstelle (Interface) zur Verfügung stellen. Dies wird erreicht durch eine Basis Klasse (Klasse Item) von der sowohl Grocery als auch Article erben. Von der Basisklasse Item sollen keine Objekte instanziiert werden können, sie dient dazu das benötigte „Interface“ zu erzwingen und Grundfunktionalität aller Waren zu implementieren. Da lediglich vier Waren im Angebot sind benötigt ShoppingCart ein Array der Länge vier um die Produkte zu speichern. Funktionalität der abstrakten Klasse Item: Die Klasse Item ist die Basisklasse aller angebotenen Waren, da sie „nicht vollständig“ ist soll kein Objekt der Klasse Item instanziiert werden können. Dies wird erreicht durch das Schlüsselwort abstract bei der Klassendefinition:
public abstract class Item .
Die Klasse erhält folgende Instanzvariablen: protected int pid // eindeutige Produktkennzeichnung protected String signifier // der Name des Produkts, zBsp. „Butter“ protected float pricePerUnit // Preis pro Einheit
Konstruktor der Klasse Item: Item(int pid, String signifier, float pricePerUnit) Methoden der Klasse Item: Implementieren Sie für jede der Instanz Variablen eine getter- Methode. Nur der Preis soll nach dem Instanziieren eines Objekts veränderbar sein. Implementieren Sie die nötige setter- Methode Implementieren Sie folgende Methode: public String toString(){ return “This is the Base Class“; } Zusätzlich erhält die Klasse abstrakte Methoden die lediglich deklariert werden aber nicht definiert, das heißt sie werden in Item nicht implementiert. Deklarieren Sie folgende abstrakte Methoden: abstact public void addItem(Item toAdd); abstact public void removeItem(Item toRemove); abstact public String getUnit(); abstact public boolean isEmpty(); abstact public float getPrice(); addItem(Item toAdd): erhöht die Warenmenge in this um die in toAdd gespeicherte Menge; removeItem(Item toRemove): entnimmt aus this die in toRemove gespeicherte Warenmenge; getUnit(): gibt die Einheit in der die Ware verkauft wir zurück, zBsp: „Pkg“, „qm“, „lfdm“; isEmpty(): gibt „true“ zurück wenn die Warenmenge auf 0 gefallen ist; getPrice(): gibt den Gesamtpreis zurück (= Menge * pricePerUnit ); Funktionalität der Klasse Grocery: Die Klasse Grocery modelliert Lebensmittel. Lebensmittel sind Waren die im Warenkorb gespeichert werden, Grocery erbt also von Item. Zusätzlich haben Lebensmittel ein Ablaufdatum (expiry Date) und werden nur in Packungen verkauft, Bruchteile von Packungen sind nicht erhältlich. Damit benötigt die Klasse Grocery eine ganzzahlige Instanzvariable für die Anzahl der gekauften/gewünschten Packungen (packetCount) und eine Instanz Variable für das Ablaufdatum mit dem Format „yyyymmdd“, zum Beispiel 20180618 für den 18. Juni 2018, also eine ganzzahlige Variable mit dem Bezeichner expiryDate. Eines der grundlegenden Konzepte der OOP ist die Datenkapselung, das heißt beschränken Sie den Zugriff auf die Instanvariablen so stark wie möglich über die Zugriffsmodifizierer. Methoden der Klasse Grocery: Implementieren Sie einen Konstruktor der alle Instanzvariablen als Parameter übernimmt und als erstes den Konstruktor der Basisklasse aufruft. Grocery(int pid,String signifier,float pricePerUnit,int expiryDate,int count) Implementieren Sie getter Methoden für die beiden zusätzlichen Instanzvariablen. Nur die Anzahl der Packete soll änderbar sein, das Ablaufdatum sollte nicht mehr geändert werden dürfen. Implementieren sie die setter Methode.
Da es von Grocery Objekte geben soll und Grocery von Item erbt müssen alle abstrakten Methoden von Item in Grocery definiert bzw. implementiert werden (ohne das Schlüsselwort abstract). Überschreiben Sie die Methode public String toString() von Item in Grocery. Der zurückgegeben String soll beispielhaft folgendes Format haben: „Butter 12 Pck 1.59/Pck 19,08“ Hinweise zu den Methoden von Grocery: Die Methode getUnit() gibt den String „Pck“ zurück, da Lebensmittel nur päckchenweise verkauft werden. Beim Hinzufügen von Waren über addItem(Item toAdd) müssen natürlich pid von toAdd und this übereinstimmen. Sinnvoll ist es zuerst zu überprüfen ob this und toAdd Instanzen der selben Klasse sind ( instanceof ) um anschließend einen “downcast“ durchführen zu können. Gleiches gilt beim Entfernen von Waren über removeItem(Item toRemove) Bei der Instanz Variablen packetCount ist darauf zu achten dass diese niemals negative Werte annehmen darf. Es können natürlich maximal so viele Päckchen dem Warenkorb entnommen werden wie im Warenkorb bereits vorhanden sind. Wird versucht mehr zu entnehmen sinkt der packetCount auf 0. Funktionalität der Klasse Article: Die Klasse Article modelliert Waren ohne Verfallsdatum die in beliebigen Bruchteilen einer Einheit, zum Beispiel Quadratmeter („qm“), verkauft werden. Entsprechend der Klasse Grocery erbt auch Article von Item. Allerdings benötigt Article andere zusätzliche Instanzvariablen als Grocery. Das sind ein String, Bezeichner unit, für die Einheit in der die Ware verkauft wird ( zum Beispiel „qm“, „lfdm“) und eine Gleitkommazahl, Bezeichner amount, für die Menge der Ware. Analog zu Grocery beschränken Sie den Zugriff auf die Instanzvariablen soweit als möglich. Methoden der Klasse Article: Implementieren Sie die Methoden der Klasse Article analog zur Klasse Grocery. Natürlich müssen Sie die Methoden an die geänderten Instanz Variablen anpassen. Der Konstruktor erhält folgende Signatur: Article(int pid, String signif, float pricePerUnit, String unit, float amount
Funktionalität der Klasse ShoppingCart: Die Klasse ShoppingCart modelliert den Warenkorb in den Waren vom Typ Grocery und/oder Article hinzugefügt oder auch wieder entfernt werden können. Da der Online Händler nur vier Waren anbietet ist ein Array von Objekten der Klasse Item mit Länge 4 (= Instanzvariable) ausreichend als Datenspeicher des Warenkorbs. Der Bezeichner des Arrays muss cart lauten, ansonsten wird der automatisierte Test nicht bestanden! Methoden der Klasse ShoppingCart: public ShoppingCart() //Default- Konstruktor public void addItem(Item toAdd) //Waren hinzufügen bzw. Menge erhöhen public void removeItem(Item toRemove) //Waren entfernen/Menge reduzieren public String toString() //gibt den Warenkorb als String zurück
Welchen Nutzen dann haben die Methoden "toAdd" in Grocery und Article?? Ich habe Grundgerüst nach der Angabe aufgebaut wie es sein soll, nur einigie Methoden sind noch nicht ausgefüllt.
Code:
{
public class Article extends Item {
float draht;
float fließen;
String unit;
float amount;
Article(){}
Article(int pid, String signif, float pricePerUnit, String unit, float amount){
super(pid, signif, pricePerUnit);
this.unit=unit;
this.amount=amount;
}
public void addItem(Item toAdd) {
}
public void removeItem(Item toRemove) {
}
public String getUnit() {
}
public boolean isEmpty() {
}
public float getPrice(int menge, int pricePerUnit) {
return menge*pricePerUnit;
}
}
Code:
public class Grocery extends Item{
int butter=0;
int milch=0;
int packetCount=0;
int expiryDate=0;
int amount;
String pck;
Grocery(){}
Grocery(int pid,String signifier,float pricePerUnit,int expiryDate,int packetCount){
super(pid, signifier, pricePerUnit);
this.expiryDate=expiryDate;
this.packetCount=packetCount;
}
int getPacketCount() {
return this.packetCount;
}
int getExpiryDate() {
return this.expiryDate;
}
void setPacketCount(int packet) {
this.packetCount=packet;
}
public void addItem(Item toAdd) {
pid=toAdd.pid;
signifier=toAdd.signifier;
pricePerUnit=toAdd.pricePerUnit;
this.expiryDate=toAdd.expiryDate;
}
Code:
public abstract class Item {
protected int pid; //eindeutige Produktkennzeichnung
protected String signifier; //Name des Produkts, z.B. Butter
protected float pricePerUnit; //Preis pro Einheit
Item(){}
Item(int pid, String signifier, float pricePerUnit){
this.pid=pid;
this.signifier=signifier;
this.pricePerUnit=pricePerUnit;
}
int getPid() {
return this.pid;
}
String getSignifier() {
return this.signifier;
}
float getPricePerUnit() {
return pricePerUnit;
}
void setPricePerUnit(int newprice) {
this.pricePerUnit=newprice;
}
public String toString() {
return "This is the Base Class";
}
abstract public void addItem(Item toAdd);
abstract public void removeItem(Item toRemove);
abstract public String getUnit();
abstract public boolean isEmpty();
abstract public float getPrice();
}
Code:
public class ShoppingCart {
public String[] cart = new String[3];
public ShoppingCart() {
}
public void addItem(Item toAdd) {
//Waren hinzufügen bzw. Menge erhöhen
}
public void removeItem(Item toRemove) {
//Waren entfernen/Menge reduzieren
}
public String toString() {
return //gibt den Warenkorb als String zurück
}
}
Die Angabe nur der Vollständigkeit halber (vorsicht viel Text)
In diesem Beispiel modellieren Sie einen einfachen digitalen Warenkorb ( Klasse ShoppingCart ) eines Online Händlers ( Klasse ShoppingMall ). Der Online Händler vertreibt, der Einfachheit wegen, nur vier verschiedene Artikel die sich in zwei Gruppen aufteilen lassen. 1. Zwei Lebensmittel (Klasse Grocery) nämlich Butter und Milch, diese werden nur in ganzen Packungen verkauft. 2. Zwei „Waren“ ohne Verfallsdatum (Klasse Article), dies sind Draht und Fliesen. Der Draht wird per laufendem Meter ( „lfdm“ ) verkauft wobei auch Bruchteile eines „lfdm“ erhältlich sind. Die Fliesen werden pro Quadratmeter („qm“) verkauft erhältlich in Bruchteilen von „qm“. Die Klassen Article und Grocery enthalten die vom Kunden gewünschte Menge in Grocery dargestellt durch eine Ganzzahl (int) in Article durch eine Gleitkommazahl (float). Um die gekauften Waren in einem Array bzw. „Container“ speichern zu können und bei der Rechnungserstellung bzw. der Ausgabe des Warenkorbes alle Waren gleich behandeln zu können müssen alle Waren- Klassen (Article und Grocery) die gleiche Schnittstelle (Interface) zur Verfügung stellen. Dies wird erreicht durch eine Basis Klasse (Klasse Item) von der sowohl Grocery als auch Article erben. Von der Basisklasse Item sollen keine Objekte instanziiert werden können, sie dient dazu das benötigte „Interface“ zu erzwingen und Grundfunktionalität aller Waren zu implementieren. Da lediglich vier Waren im Angebot sind benötigt ShoppingCart ein Array der Länge vier um die Produkte zu speichern. Funktionalität der abstrakten Klasse Item: Die Klasse Item ist die Basisklasse aller angebotenen Waren, da sie „nicht vollständig“ ist soll kein Objekt der Klasse Item instanziiert werden können. Dies wird erreicht durch das Schlüsselwort abstract bei der Klassendefinition:
public abstract class Item .
Die Klasse erhält folgende Instanzvariablen: protected int pid // eindeutige Produktkennzeichnung protected String signifier // der Name des Produkts, zBsp. „Butter“ protected float pricePerUnit // Preis pro Einheit
Konstruktor der Klasse Item: Item(int pid, String signifier, float pricePerUnit) Methoden der Klasse Item: Implementieren Sie für jede der Instanz Variablen eine getter- Methode. Nur der Preis soll nach dem Instanziieren eines Objekts veränderbar sein. Implementieren Sie die nötige setter- Methode Implementieren Sie folgende Methode: public String toString(){ return “This is the Base Class“; } Zusätzlich erhält die Klasse abstrakte Methoden die lediglich deklariert werden aber nicht definiert, das heißt sie werden in Item nicht implementiert. Deklarieren Sie folgende abstrakte Methoden: abstact public void addItem(Item toAdd); abstact public void removeItem(Item toRemove); abstact public String getUnit(); abstact public boolean isEmpty(); abstact public float getPrice(); addItem(Item toAdd): erhöht die Warenmenge in this um die in toAdd gespeicherte Menge; removeItem(Item toRemove): entnimmt aus this die in toRemove gespeicherte Warenmenge; getUnit(): gibt die Einheit in der die Ware verkauft wir zurück, zBsp: „Pkg“, „qm“, „lfdm“; isEmpty(): gibt „true“ zurück wenn die Warenmenge auf 0 gefallen ist; getPrice(): gibt den Gesamtpreis zurück (= Menge * pricePerUnit ); Funktionalität der Klasse Grocery: Die Klasse Grocery modelliert Lebensmittel. Lebensmittel sind Waren die im Warenkorb gespeichert werden, Grocery erbt also von Item. Zusätzlich haben Lebensmittel ein Ablaufdatum (expiry Date) und werden nur in Packungen verkauft, Bruchteile von Packungen sind nicht erhältlich. Damit benötigt die Klasse Grocery eine ganzzahlige Instanzvariable für die Anzahl der gekauften/gewünschten Packungen (packetCount) und eine Instanz Variable für das Ablaufdatum mit dem Format „yyyymmdd“, zum Beispiel 20180618 für den 18. Juni 2018, also eine ganzzahlige Variable mit dem Bezeichner expiryDate. Eines der grundlegenden Konzepte der OOP ist die Datenkapselung, das heißt beschränken Sie den Zugriff auf die Instanvariablen so stark wie möglich über die Zugriffsmodifizierer. Methoden der Klasse Grocery: Implementieren Sie einen Konstruktor der alle Instanzvariablen als Parameter übernimmt und als erstes den Konstruktor der Basisklasse aufruft. Grocery(int pid,String signifier,float pricePerUnit,int expiryDate,int count) Implementieren Sie getter Methoden für die beiden zusätzlichen Instanzvariablen. Nur die Anzahl der Packete soll änderbar sein, das Ablaufdatum sollte nicht mehr geändert werden dürfen. Implementieren sie die setter Methode.
Da es von Grocery Objekte geben soll und Grocery von Item erbt müssen alle abstrakten Methoden von Item in Grocery definiert bzw. implementiert werden (ohne das Schlüsselwort abstract). Überschreiben Sie die Methode public String toString() von Item in Grocery. Der zurückgegeben String soll beispielhaft folgendes Format haben: „Butter 12 Pck 1.59/Pck 19,08“ Hinweise zu den Methoden von Grocery: Die Methode getUnit() gibt den String „Pck“ zurück, da Lebensmittel nur päckchenweise verkauft werden. Beim Hinzufügen von Waren über addItem(Item toAdd) müssen natürlich pid von toAdd und this übereinstimmen. Sinnvoll ist es zuerst zu überprüfen ob this und toAdd Instanzen der selben Klasse sind ( instanceof ) um anschließend einen “downcast“ durchführen zu können. Gleiches gilt beim Entfernen von Waren über removeItem(Item toRemove) Bei der Instanz Variablen packetCount ist darauf zu achten dass diese niemals negative Werte annehmen darf. Es können natürlich maximal so viele Päckchen dem Warenkorb entnommen werden wie im Warenkorb bereits vorhanden sind. Wird versucht mehr zu entnehmen sinkt der packetCount auf 0. Funktionalität der Klasse Article: Die Klasse Article modelliert Waren ohne Verfallsdatum die in beliebigen Bruchteilen einer Einheit, zum Beispiel Quadratmeter („qm“), verkauft werden. Entsprechend der Klasse Grocery erbt auch Article von Item. Allerdings benötigt Article andere zusätzliche Instanzvariablen als Grocery. Das sind ein String, Bezeichner unit, für die Einheit in der die Ware verkauft wird ( zum Beispiel „qm“, „lfdm“) und eine Gleitkommazahl, Bezeichner amount, für die Menge der Ware. Analog zu Grocery beschränken Sie den Zugriff auf die Instanzvariablen soweit als möglich. Methoden der Klasse Article: Implementieren Sie die Methoden der Klasse Article analog zur Klasse Grocery. Natürlich müssen Sie die Methoden an die geänderten Instanz Variablen anpassen. Der Konstruktor erhält folgende Signatur: Article(int pid, String signif, float pricePerUnit, String unit, float amount
Funktionalität der Klasse ShoppingCart: Die Klasse ShoppingCart modelliert den Warenkorb in den Waren vom Typ Grocery und/oder Article hinzugefügt oder auch wieder entfernt werden können. Da der Online Händler nur vier Waren anbietet ist ein Array von Objekten der Klasse Item mit Länge 4 (= Instanzvariable) ausreichend als Datenspeicher des Warenkorbs. Der Bezeichner des Arrays muss cart lauten, ansonsten wird der automatisierte Test nicht bestanden! Methoden der Klasse ShoppingCart: public ShoppingCart() //Default- Konstruktor public void addItem(Item toAdd) //Waren hinzufügen bzw. Menge erhöhen public void removeItem(Item toRemove) //Waren entfernen/Menge reduzieren public String toString() //gibt den Warenkorb als String zurück