Vererbung?!

unknownUser

Neues Mitglied
unknown.png

Hallo zusammen, ich möchte neben den Klassen eine Klasse implementieren, die jeweils die getPrice-Methoden von Salad und Publication addiert. Wie kann ich jeweils auf die erstellten Objekte (Salad und Publication) zugreifen? Bei einer Vererbung müsste ich ja theorethisch alles von der abstrakten Klasse ShoppingCardEntry erben? Vielen Dank für jegliche Hilfe
🙂
 

Oneixee5

Top Contributor
Die Addition wäre imho eine Aufgabe von ShoppingCard. ShoppingCard sollte nach meinem Verständnis die ShoppingCardEntry's kennen. Somit kann ShoppingCard die Preise abholen und addieren.
 

unknownUser

Neues Mitglied
Erstmal, vielen Dank für deine Antwort :)

Ja, das wäre auch meine Idee gewesen. Ich hätte jetzt spontan gedacht, einfach das die Klasse ShoppingCard den Interface Buyable erbt. Jedoch weiß ich nicht ganz wie ich dies realisieren soll. Das Problem ist, wenn jedes Mal ein Objekt von den Childs erzeugt wird möchte ich jeweils die Preise von allen erzeugten Objekten addieren. Bei der Idee mit der Erstellung einer neuen Klasse, die das Interface erbt kriege ich das Problem mit dem Rückgabewert nicht gelöst?


Die Addition wäre imho eine Aufgabe von ShoppingCard. ShoppingCard sollte nach meinem Verständnis die ShoppingCardEntry's kennen. Somit kann ShoppingCard die Preise abholen und addieren.
 

fhoffmann

Top Contributor
Du solltest das Problem nicht über Vererbung ("is a") sondern über Komposition ("has a") lösen.
Deine Klasse ShoppingCard bekommt also eine Liste von ShoppingCardEntry. Um den Gesamtpreis zu berechnen, geht sie dann die Liste durch und addiert die Einzelpreise.
 

Oneixee5

Top Contributor
Java:
    public static final class ShoppingCard {

        private final List<ShoppingCardEntry> shoppingCardEntrys = new ArrayList<>();

        public void add(final ShoppingCardEntry shoppingCardEntry) {
            this.shoppingCardEntrys.add(shoppingCardEntry);
        }

        public int getTotal() {
            return this.shoppingCardEntrys.stream().collect(Collectors.summingInt(ShoppingCardEntry::getPrice));
        }

    }

    public static final class ShoppingCardEntry {

        private final int price;

        public ShoppingCardEntry(final int price) {
            this.price = price;
        }

        public int getPrice() {
            return this.price;
        }

    }

    public static void main(final String[] args) throws Exception {

        final ShoppingCard shoppingCard = new ShoppingCard();

        for (int i = 0; i < 20; i++) {
            shoppingCard.add(new ShoppingCardEntry(i));
        }

        System.out.println(shoppingCard.getTotal());
    }
 

White_Fox

Top Contributor
Ich hätte jetzt spontan gedacht, einfach das die Klasse ShoppingCard den Interface Buyable erbt. Jedoch weiß ich nicht ganz wie ich dies realisieren soll.
Versuche, den Code mal zu lesen. Und zwar im Sinne davon, daß Bezeichner eine Bedeutung haben. Wenn du einen deutschen Text liest, dann erfaßt du (hoffentlich) dessen Sinn. Lerne, Quellcodetext genauso zu lesen, denn dann lösen sich viele Fragen in Wohlgefallen auf.

Und dann überlege mal: ist ein ShoppingCard (Ich vermute mal einen Schreibfehler, es soll wohl eher ein ShoppingCardt sein) "Byable"? Auch wenn man einen Euro in den Wagen steckt, gilt es doch allgemein als Frevel, ihn nach dem Einkauf mitzunehmen.

PS:
Und wenn du Quellcode sinnerfassend lesen kannst (ich meine das übrigens tatsächlich nicht ironisch oder so, ich schätze mal 80% aller Anfängerfragen hängen an dieser Stelle und würde sich in Wohlgefallen auflösen, wenn sie Quellcode als sinnvollen Text lesen würden), versuche künftig, auch sinnvollen Quellcode zu schreiben – richtig guten Quellcode zu schreiben ist eine Kunst, hilft dir aber selbst am meisten.
 

fhoffmann

Top Contributor
Und dann überlege mal: ist ein ShoppingCard (...) "Byable"? Auch wenn man einen Euro in den Wagen steckt, gilt es doch allgemein als Frevel, ihn nach dem Einkauf mitzunehmen.
Möglicherweise hat aber auch nur das Interface "Byable" einen unglücklichen Namen (und man sollte diesen Namen ändern). Denn ShoppingCard (oder ShopingCart) kann durchaus die Methode getPrice() (im Beispiel von @Oneixee5 getTotal() genannt) implementieren.
 

fhoffmann

Top Contributor
Was mir am ursprünglichen Modell nicht gefällt, ist, dass die Klasse ShoppingCardEntry ein protected Member amonut (vom Typ int) hat. Sollen nun alle erbenden Klassen (und es wird viele erbende Klassen geben) ihren eigenen Preis mit der Menge der Produkte multiplizieren? Das kann doch nur schief gehen!
 

D.gigi

Aktives Mitglied
Hallo zusammen ich wollte auch mal mich an die UML Datei heranwagen, nun versteh ich das interface Buyable nicht so ganz und wo wird Buyable nun in der klasse ShoppingCartEntry implementiert wäre super wenn mir da jemand einen ansatz geben könnte LG.
 

mihe7

Top Contributor
nun versteh ich das interface Buyable nicht so ganz
Das Interface spezifiziert eine Methode namens getPrice(), die ein float liefert. Jede Klasse, die dieses Interface implementiert, bietet demnach diese Methode an (bzw. muss diese Methode anbieten).

wo wird Buyable nun in der klasse ShoppingCartEntry implementiert
Verstehe die Frage nicht, daher einfach mal ein kleines Beispiel:
Java:
class FreeItem implements Buyable {
    @Override
    public float getPrice() {
        return 0f;
    }
}
Oder meinst Du im UML? Das wird durch die gestrichelte Generalisierung angezeigt, bei einer Vererbung wäre die Linie durchgezogen.
 

X5-599

Top Contributor
Vermutlich ist gemeint, dass im UML die Klasse "ShoppingCardEntry" das Interface "Buyable" implementiert aber die benötigte Methode "getPrice" nicht in dessen Methodenliste auftaucht. Was natürlich ein Fehler wäre. Beim genauen hinsehen allerdings fällt auf, dass "ShoppingCardEntry" in Italics geschrieben ist. In UML ist das eine Möglichkeit um abstrakte Klassen darzustellen.

Lange Rede; kurzer Sinn: Die Klasse "ShoppingCardEntry" implementiert das Interface, braucht aber die darin vereinbarte Methode nicht anzubieten, da sie abstrakt ist. Somit reicht es, wenn die davon erbenden Klassen jeweils die Methode anbieten.

Anmerkung: Natürlich könnten diese erbenden Klassen auch ihrerseits abstrakt sein. Dann müssten sie die Methode ebenfalls nicht selbst anbieten. So kann man diese Verantwortung immer weiter "nach hinten" schieben. Bis zu dem Punkt an dem eine instanziierbare (nicht abstrakte) Klasse definiert wird. Die muss dann letztendlich die Interface Methode anbieten.

Anmerkung zur Anmerkung: Das heißt natürlich nicht, dass nur "nicht abstrakte" Klassen die Interface Methoden bereit stellen dürfen. In der fiktiven Vererbung, die ich angedeutet habe (wo abstrakte Klasse von abstrakter Klasse erbt etc), ist es durchaus erlaubt, dass eine der abstrakten Klassen diese Interface Methode selbst anbietet und somit eine von dieser abstrakten Klasse erbende instanziierbare Klasse das nun nicht mehr tun muss (obwohl sie das natürlich immer noch könnte).
 
Zuletzt bearbeitet:

X5-599

Top Contributor
Das würde ich so nicht sagen, da in UML "nicht dargestellt" einfach nur "nicht dargestellt" heißt.

Das kann natürlich sein. Ich bin auch der erste, der zugibt mit UML schon immer auf Kriegsfuß gestanden zu sein. Ich schieb' das auf die Informatiker Schule, die uns zuerst das Programmieren beigebracht hat und erst viel später Software Engineering. UML war mir da immer "zu abstrakt".


also wenn du es nicht gesagt hättest hätte ich es nicht gesehen.. da muss man wirklich mit ner lupe ran gehen

Gibt wohl auch noch andere Möglichkeiten Klassen als abstrakt zu kennzeichnen. "Klassenname {abstract}" oder "Klassenname <<abstract>>". Wobei sich die Leute da wohl auch nicht einig sind was nun erlaubt ist und was nicht.
In Anlehnung an meine Antwort an Mihe7 von oben: Bei so einem Thema wie UML wundert mich das auch nicht wirklich.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
temi Problem mit Aufrufreihenfolge bei Vererbung Allgemeine Java-Themen 3
MiMa Vererbung und Komposition?? Allgemeine Java-Themen 38
Kirby.exe Vererbung bei Generics Allgemeine Java-Themen 7
L Vererbung Verständnis Probleme Vererbung Allgemeine Java-Themen 2
W Generics + Vererbung Allgemeine Java-Themen 47
M Vererbung mithilfe von Bluej Allgemeine Java-Themen 3
M List -Tableview-Javafx-Vererbung Allgemeine Java-Themen 35
A Vererbung Selbstreferenzparameter Allgemeine Java-Themen 14
D Thema: Vererbung Ober-/Unterklassen Allgemeine Java-Themen 16
D Frage zu Vererbung Allgemeine Java-Themen 5
N Vererbung mit GUI Allgemeine Java-Themen 9
E Vererbung Countable mit Vererbung Allgemeine Java-Themen 6
J 2 Fragen zur Vererbung Allgemeine Java-Themen 5
T Javaklassen und vererbung Allgemeine Java-Themen 32
F Vererbung Allgemeine Java-Themen 5
Neumi5694 Vererbung Restriktive Vererbung Allgemeine Java-Themen 4
A Vererbung Übungsaufgabe Vererbung - Erstellung Klassenhierarchie Allgemeine Java-Themen 1
J Allgemeine Fragen zu Vererbung Allgemeine Java-Themen 1
kaoZ Generics und Vererbung Allgemeine Java-Themen 3
D Problem bei Vererbung abstrakter Klassen Allgemeine Java-Themen 6
D Object nach Vererbung mit Class Object überprüfen Allgemeine Java-Themen 4
T Super Klasse Vererbung Problem :/ Allgemeine Java-Themen 10
L Unabhängige Auslieferung bei Vererbung Allgemeine Java-Themen 20
S MVC - Vererbung Allgemeine Java-Themen 4
C Enums und Vererbung Allgemeine Java-Themen 6
F Google Guice + Generics + Vererbung Allgemeine Java-Themen 5
D Unterschied Vererbung und Polymorphie? Allgemeine Java-Themen 4
K Vererbung ohne Basisklasse zu kennen Allgemeine Java-Themen 20
Da_Tebe ArrayList<xyz> Verschachtelung oder Vererbung? Allgemeine Java-Themen 6
faetzminator statische Variablen in Interface - Vererbung? Allgemeine Java-Themen 9
M OOP PropertyChangeListener - Vererbung oder Komposition? Allgemeine Java-Themen 5
S OOP Mehrfache Vererbung von abstrakten Klassen Allgemeine Java-Themen 7
G Designfrage Vererbung ja oder nein Allgemeine Java-Themen 9
S equals - Identität ändern bei Vererbung? Allgemeine Java-Themen 5
dayaftereh Vererbung Hilfe Allgemeine Java-Themen 2
D Vererbung, Reflection und automatischer Methodenaufruf Allgemeine Java-Themen 24
A PropertyChangeListener Vererbung Allgemeine Java-Themen 4
P DefaultTreeCellRenderer Vererbung Allgemeine Java-Themen 5
S Objekte die Objekte enthalten: Keine Vererbung Allgemeine Java-Themen 4
J Vererbung bei abstrakten Klassen Allgemeine Java-Themen 2
S Vererbung: Welche Methode wird verwendet? Allgemeine Java-Themen 9
L Checkstyle: Wann ist eine Methode für Vererbung entworfen? Allgemeine Java-Themen 13
S normale vererbung als interface Allgemeine Java-Themen 2
S statische Methoden und Vererbung Allgemeine Java-Themen 6
R Vererbung - doppelte Paint-Methode Allgemeine Java-Themen 4
R Vererbung mit Interface und Abstract Allgemeine Java-Themen 3
B Vererbung bei enums ? Allgemeine Java-Themen 3
W Frage zu Vererbung / konkretes Beispiel Allgemeine Java-Themen 4
F Vererbung von SessionBeans Allgemeine Java-Themen 3
O abstract, privat, Vererbung Allgemeine Java-Themen 29
L Annotations mit Vererbung Allgemeine Java-Themen 4
M Singleton und Vererbung? Allgemeine Java-Themen 45
T Problem mit Vererbung Allgemeine Java-Themen 3
V Vererbung und Schleifen Allgemeine Java-Themen 5
C Comparable + Vererbung Funktioniert nicht? Allgemeine Java-Themen 4
A Ansatz Objektorientierung, Methoden Vererbung Allgemeine Java-Themen 2
D Listen von Generischen Typen inkl. Vererbung Allgemeine Java-Themen 2
D Zugriffsmethode nach Vererbung ändern? Allgemeine Java-Themen 5
S Vererbung in UML Allgemeine Java-Themen 3
T Nochmal Frage zu Vererbung Interfaces etc. Allgemeine Java-Themen 10
Y Gedanken zur Vererbung Allgemeine Java-Themen 7
F Vererbung, Generizität und Collections. Allgemeine Java-Themen 7
G Frage zu statischen Variablen bei Vererbung Allgemeine Java-Themen 15
F Vererbung Allgemeine Java-Themen 5
S Vererbung von mehreren Klassen? Allgemeine Java-Themen 5
C enum und Vererbung Allgemeine Java-Themen 3
K Problem mit Vererbung - Kein wirklicher Nutzen. Allgemeine Java-Themen 10
G vererbung vs benutzung Allgemeine Java-Themen 7
L Vererbung klappt nicht Allgemeine Java-Themen 5
W Probleme mit Arrays und Vererbung ! Allgemeine Java-Themen 5
M vererbung einer "selbst-instanzierungs-klasse" Allgemeine Java-Themen 16
J Vererbung. Allgemeine Java-Themen 8
H Frage zur Vererbung Allgemeine Java-Themen 5
S private Instanzvaribalen bei "Innerer-Vererbung" Allgemeine Java-Themen 9
H Vererbung auch ohne erzeugung einer Instanz möglich? Allgemeine Java-Themen 3
M frage zur vererbung Allgemeine Java-Themen 12
G Generics und Vererbung. Allgemeine Java-Themen 21
M Vererbung von Hashtables Allgemeine Java-Themen 5
C dynamische Vererbung Allgemeine Java-Themen 6

Ähnliche Java Themen

Neue Themen


Oben