Designfrage Vererbung ja oder nein

gorgonsel

Mitglied
Hallo,

ich habe eine Klasse Produkt, die mit der Zeit gewachsen ist und einige Methode haben etliche if Anweisungen, die nach Produtktyp unterscheiden. Also habe ich angefangen, alles was allgemein gültig ist, in eine Basisklasse Produkt zu schreiben und Subklassen zu bilden (ca. 30 Stück). Jetzt stellt sich folgende Frage bei der Methode setRabatt: Macht hier Vererbung wirklich Sinn.

Die Höhe des Rabatts hängt nicht nur vom Produkt ab, sondern auch vom angemeldeten Benutzer. So würde sich also die Abfrage auf den Benutzer in den Subklassen immer wiederholen. Gibt es einen eleganteren Weg, das zu lösen, oder sollte ich diese Methode lieber in der Klasse Produkt so stehen lassen und nur da Vererbung nutzen, wo die Funktionalität nur vom Produkttyp abhängt?

Frank


Java:
// Ohne Vererbung

class Produkt {
	void setRabatt() {
		if (this.getAngebot().getUser().isAdmin() {
			// Erlaube bis 100% Rabatt
		}
		else {
			if (this.getProduktbereich == B1) {
				// Erlaube bis 20% Rabatt
			}
			else if (this.getProduktbereich == B2) {
				// Erlaube bis 30% Rabatt
			}
			else {
				// Erlaube bis 10% Rabatt
			}
		}
	)
}



// Mit Vererbung
class Produkt {
	void setRabatt() {
		if (this.getAngebot().getUser().isAdmin() {
			// Erlaube bis 100% Rabatt
		}
		else {
			// Erlaube bis 10% Rabatt
		}
	)
)

class Produkt_B1 extends Produkt {
	void setRabatt() {
		if (this.getAngebot().getUser().isAdmin() {
			// Erlaube bis 100% Rabatt
		}
		else {
			// Erlaube bis 20% Rabatt
		}
	)
}

class Produkt_B2 extends Produkt {
	void setRabatt() {
		if (this.getAngebot().getUser().isAdmin() {
			// Erlaube bis 100% Rabatt
		}
		else {
			// Erlaube bis 30% Rabatt
		}
	)
}
 
S

Stewe

Gast
so funktioniert vererbung

Java:
// Mit Vererbung
class Produkt {
    void setRabatt() {
        if (this.getAngebot().getUser().isAdmin() {
            // Erlaube bis 100% Rabatt
        }
        else {
            getProduktRabatt();
        }
    )


protected double getproduktRabatt() {
  return 0.1;
}

)
 
class Produkt_B1 extends Produkt {
  protected double getproduktRabatt() {
    return 0.2;
  }
}
 
class Produkt_B2 extends Produkt {
  protected double getproduktRabatt() {
    return 0.3;
  }
}
 

Michael...

Top Contributor
Die Höhe des Rabatts hängt nicht nur vom Produkt ab
Ein Rabatt hängt überhaupt nicht vom Produkt ab. Er wird eventuell für spezielle Produkte, spezielle Kunden oder allgemein gewährt.
So würde sich also die Abfrage auf den Benutzer in den Subklassen immer wiederholen. Gibt es einen eleganteren Weg, das zu lösen, oder sollte ich diese Methode lieber in der Klasse Produkt so stehen lassen und nur da Vererbung nutzen, wo die Funktionalität nur vom Produkttyp abhängt?
Weder noch. Ich würde sagen im Gegesatz zum Preis oder einer UVP ist ein Rabatt keine Eigenschaft eines Produktes, sondern gehört eher in den Kontext eines Verkaufsprozesses. Daher würde ich den Rabatt zu einem Produkt oder einer Produktgruppe eher in einer separaten Liste/Map pflegen.
 

Andi_CH

Top Contributor
Die Tatsache dass jedes Produkt einen Rabatt hat genügt, dass alle Features welche Rabatt betreffen auch im Produkt angesiedelt sind.

Im allgemeinen gesagt:

Viele if's lassen sich sehr elegant lösen. (Die Methode setRabat im obigen Beispiel ist absolut überflüssig)

In der Vaterklasse hat es eine abstrakte Methode getRabat welche ja überschrieben werden muss und damit kannst du jedes Produkt nach seinem Rabat fragen - das Produkt selbst kann es natürlich auch.

Wenn du zwingend setRabat haben willst und das wirklich ohne Parameter funktionieren soll, sieht es so aus
Java:
	abstract class Produkt {
		protected double rabatt;
		abstract void setRabatt();
		double getProduktRabatt() { return rabatt; }
	}

	class Produkt_B1 extends Produkt {
		@Override
		void setRabatt() {
			rabatt = 0.2;
		}
	}

	class Produkt_B2 extends Produkt {
		@Override
		void setRabatt() {
			rabatt = 0.3;
		}
	}
 

gorgonsel

Mitglied
Sorry,

ich hatte wirklich vergessen, den Parameter reinzuschreiben bei der set-Methode.
Die Methode bekommt von der Oberfläche einen Rabatt und soll je nach Produkt und angemeldetem User
den Rabatt korrigieren, also z.B. auf den erlaubten Max-Wert setzen, falls die Eingabe höher ist.
Würde das nur vom Produkt abhängen, ist Vererbung prima. Mir geht es um das Problem, dass ich die Verschachtelung mit der Abfrage nach dem User auch in jeder abgeleiteten Klasse noch ein mal muss, sich dieser Code also immer wieder wiederholt, da für jedes Produkt gleich.
 

Andi_CH

Top Contributor
Es ist ganz einfach - wenn der Code in einer Funktion für alle Produkte identisch ist, kommt er in die Vaterklasse.
Wenn nicht kommt in die Vaterklasse nur der Funktionsprotoyp (die abstrakte Deklaration) und die Implementation steht in jedem Produkt.
 

gorgonsel

Mitglied
Hallo,

Es ist ganz einfach - wenn der Code in einer Funktion für alle Produkte identisch ist, kommt er in die Vaterklasse.
Wenn nicht kommt in die Vaterklasse nur der Funktionsprotoyp (die abstrakte Deklaration) und die Implementation steht in jedem Produkt.

das ist soweit schon klar, mit geht es darum, daß der Code aber nicht nur vom Produkttyp (das was ich in den Subklassen implementiere) abhängt, sondern auch noch vom User, der angemeldet ist. In der Methode setRabatt ist also der Teil "wenn User = Admin, dann erlaube 100%", für alle Produkte gleich, könnte also in die Vaterklasse, der zweite Teil der Methode aber nur vom Produkttyp. Diese beiden Dinge kann ich nicht auseinanderreißen. Damit muss ich in jeder Subklasse wieder die Prüfung nach dem User einbauen und das ist sehr unschön.
 

ThreadPool

Bekanntes Mitglied
Dann lager die ganze Rabattgeschichte doch einfach aus, eine spontane grobe Idee wäre sowas wie einen Rabattrechner einzuführen, dann eine passende Factory dazu die du mit Produkttyp und User konfigurieren kannst und dann vll. noch ein Interface das eine Methode berechneRabatt hat welche die "rabattierbaren" Produkte implementieren und dort instanziierst du dann mit der Factory, dem User und Produkttyp als Argument einen passenden Rabattrechner (die kannst du auch cachen in der Factory) und lässt dir den Rabatt ausgeben.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
V Designfrage: try-catch-throws Allgemeine Java-Themen 11
L Designfrage: Dispatcher-Programmierung - redundante Auslegung Allgemeine Java-Themen 1
F.S.WhiTeY Designfrage bzw. Meinung zur Umsetzung Allgemeine Java-Themen 39
G Designfrage: Exceptions in Konstruktoren Allgemeine Java-Themen 7
E Wie anfangen? Konzept / Designfrage Allgemeine Java-Themen 17
heart_disease Designfrage: Statische Konfigurationsklasse Allgemeine Java-Themen 10
sliwalker Designfrage: Dateninhalte in Komponenten variabel halten Allgemeine Java-Themen 4
N DesignFrage FactoryPattern Allgemeine Java-Themen 7
N verschiedene Klasse laden (Designfrage) Allgemeine Java-Themen 2
A Designfrage zu Dateimanager Allgemeine Java-Themen 4
O Designfrage Allgemeine Java-Themen 6
T Designfrage: Viele, kleine Objekte Allgemeine Java-Themen 13
T Designfrage: Audiochat Allgemeine Java-Themen 3
S Designfrage Allgemeine Java-Themen 3
U Vererbung?! Allgemeine Java-Themen 15
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
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
M Aggreagtion ja/nein [UML] Allgemeine Java-Themen 3
J Systemtray bereits vorhanden ja oder nein? Allgemeine Java-Themen 4
J Firefox nein IE ja Allgemeine Java-Themen 9
P Ist das möglich mit Java - wenn Nein wie sonst? Allgemeine Java-Themen 8
G 1.4 ja - 1.5 - nein! Warum? Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben