Hallo zusammen,
ich nehme mal das klassiche Beispiel von Fahrzeugen und Autos. Auto erbt von Fahrzeug.
Fahrzeug kann allerdings diverse Eigenschaften haben und da Java keine optionalen Parameter erlaubt, kann man den Konstruktor überladen mit verschiedenen Kombinationen von Eigenschaften.
Allerdings werden Konstruktoren nicht mit vererbt und so muss ich die Konstruktoren mit super() durchreichen in meiner Kind-Klasse Auto.
Was ist aber nun wenn ich in Auto selber beim Konstruktor was setzen will? Ich habe mal um das zu veranschaulichen ein fiktives Beispiel erstellt:
[HIGHLIGHT="Java"]public class Car extends Vehicle {
// example attribute
private int value;
public Car(String color, String name, double weight) {
super(position, orientation, weight);
// this here is stupid...:
this.value = calcValue();
}
public Car(String color, String name) {
super(position, orientation);
// ... because here I need to write it again:
this.value = calcValue();
}
private int calcValue() {
// .. fancy code
//return fancyValue;
}
}
public abstract class Vehicle {
private double weight = 0; //in kg
private String color = "";
private String name = "";
public Vehicle(String color, String name) {
this(color, name);
}
public Vehicle(String color, String name, double weight) {
this.setName(name);
this.setColor(color);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public void setWeight(double weight) {
this.weight = weight;
}
public double getWeight() {
return weight;
}
}
[/HIGHLIGHT]
Beim erstellen von Car will ich auch etwas Car-Spezifisches machen (hier beispielhaft einen 'value'(wertigkeit) zuweisen.
Würde Car nicht erben hätte ich ja einen 'haupt'-Konstruktor und alle anderen parameter-Kombinationen würden mit this() diesen aufrufen und nicht übergebene Parameter mit Standardwerten füllen. Dies macht aber die Oberklasse Vehicle hier, also muss ich doch super() aufrufen!?
Ich könnte auch bei jedem Konstruktor in Car eine Methode aufrufen in der ich dann wiederrum die Car-Spezifischen Sachen mache, aber das ist irgendwie blöd. Gibt es da keine elegantere Methode? In meinem richtigem Projekt sind es nämlich wesentlich mehr Konstruktoren und Parameter die das alles umständlicher machen.
Wie ist der 'saubere' Weg?
Vielen Dank schonmal,
Gruß
-SPM-Mad
ich nehme mal das klassiche Beispiel von Fahrzeugen und Autos. Auto erbt von Fahrzeug.
Fahrzeug kann allerdings diverse Eigenschaften haben und da Java keine optionalen Parameter erlaubt, kann man den Konstruktor überladen mit verschiedenen Kombinationen von Eigenschaften.
Allerdings werden Konstruktoren nicht mit vererbt und so muss ich die Konstruktoren mit super() durchreichen in meiner Kind-Klasse Auto.
Was ist aber nun wenn ich in Auto selber beim Konstruktor was setzen will? Ich habe mal um das zu veranschaulichen ein fiktives Beispiel erstellt:
[HIGHLIGHT="Java"]public class Car extends Vehicle {
// example attribute
private int value;
public Car(String color, String name, double weight) {
super(position, orientation, weight);
// this here is stupid...:
this.value = calcValue();
}
public Car(String color, String name) {
super(position, orientation);
// ... because here I need to write it again:
this.value = calcValue();
}
private int calcValue() {
// .. fancy code
//return fancyValue;
}
}
public abstract class Vehicle {
private double weight = 0; //in kg
private String color = "";
private String name = "";
public Vehicle(String color, String name) {
this(color, name);
}
public Vehicle(String color, String name, double weight) {
this.setName(name);
this.setColor(color);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public void setWeight(double weight) {
this.weight = weight;
}
public double getWeight() {
return weight;
}
}
[/HIGHLIGHT]
Beim erstellen von Car will ich auch etwas Car-Spezifisches machen (hier beispielhaft einen 'value'(wertigkeit) zuweisen.
Würde Car nicht erben hätte ich ja einen 'haupt'-Konstruktor und alle anderen parameter-Kombinationen würden mit this() diesen aufrufen und nicht übergebene Parameter mit Standardwerten füllen. Dies macht aber die Oberklasse Vehicle hier, also muss ich doch super() aufrufen!?
Ich könnte auch bei jedem Konstruktor in Car eine Methode aufrufen in der ich dann wiederrum die Car-Spezifischen Sachen mache, aber das ist irgendwie blöd. Gibt es da keine elegantere Methode? In meinem richtigem Projekt sind es nämlich wesentlich mehr Konstruktoren und Parameter die das alles umständlicher machen.
Wie ist der 'saubere' Weg?
Vielen Dank schonmal,
Gruß
-SPM-Mad