Moin,
eine kurze Frage, bei der ich auf keinen Ansatz komme.
Wie kann man in Java erzwingen, dass in einer von einer abstrakten
Klasse abgeleiteten Klasse 1. eine Funktion und 2. eine Konstante
gesetzt wird.
Zumindest für 2. fiele mir in C++ eine Lösung ein. Da würde man
1
virtualvoidFunktion()=0;
(oder ähnlich) schreiben und wenn man in der abgeleiteten Klasse die
Funktion nicht überschreibt, gibt es einen Fehler.
Aber wie macht man das in Java mit Konstanten?
Gibt es da ein Schlüsselwort oder muss man Tricks anwenden?
Es ist jedoch nicht möglich, die Existenz einer Variable zu verlangen.
Dafür nimmt man dann getter/setter. im Java hat sowieso alles getter und
setter
Ausserdem sollten statt abstracten Klassen praktisch immer interfaces
verwendet werden. Ist dann einfach eine andere, besser erweiterbare
semantik.
Daniel A. schrieb:> Java equivalent wäre abstract
Ok, man kann also auch Funktionen abstrakt machen. Das funktioniert.
Gibt es sowas für Konstanten nicht? Wenn ich die abstrakte Funktion in
den Unterklassen nicht definiere, gibt es eine Warnung. Das hätte ich
gerne auch für die Konstanten.
Daniel A. schrieb:> Es ist jedoch nicht möglich, die Existenz einer Variable zu verlangen.> Dafür nimmt man dann getter/setter.
Wie meinst du das? Getter und Setter kenne ich, aber wie kann man damit
die Variable erzwingen?
Daniel A. schrieb:> Ausserdem sollten statt abstracten Klassen praktisch immer interfaces> verwendet werden.
Ich denke, eine abstrakte Klasse ist hier aber besser, weil manche
Funktionen für alle abgeleiteten Klassen gleich sind und damit in der
Basisklasse definiert sein sollten.
Dussel schrieb:> Daniel A. schrieb:>> Es ist jedoch nicht möglich, die Existenz einer Variable zu verlangen.>> Dafür nimmt man dann getter/setter.> Wie meinst du das? Getter und Setter kenne ich, aber wie kann man damit> die Variable erzwingen?
Nunjs, man kann die Variable nicht erzwingen, aber man kann abstrakte
getter und setter anlegen. Diese müssen dann implementiert werden. In
java ist es sowieso unüblich direkt auf Objekteigenschaften zuzugreifen.
Dussel schrieb:> Ich denke, eine abstrakte Klasse ist hier aber besser, weil manche> Funktionen für alle abgeleiteten Klassen gleich sind und damit in der> Basisklasse definiert sein sollten.
Trotzdem ist an der Stelle die Frage ob es Sinn macht die gemeinsame
Funktionalität über ein eigenes Objekt via Dependency Injection
bereitzustellen. Es gibt nicht umsonst die Faustregel "Favor Composition
over Inheritance", aber um das zu beurteilen müsste man dein Problem
kennen. Zumal Java quasi nur implementation inheritance kann und das oft
genug nicht genau das ist was man haben will bzw. ungewollte
Nebeneffekte hat. Vererbungshierachien kommen nicht selten mit
verringerter Wartbarkeit daher. BTDT
@Dussel (Gast)
Mir ist gerade aufgefallen, das die Existenz abstrakte Variablen
garkeinen sinn ergeben würden, da die Definition einer solchen dessen
exakte definition in den unterklassen erforden würde. Wenn man eine
Variable mit sinvollem Scope in eine (abstrakte) Klasse packt, haben
alle Unterklassen diese sowieso, womit dessen Definition in diesen
überflüssig wird.
@Mark Brandis (markbrandis)
Mag sein, aber es ist immer besser als ein direckter Variabel zugriff.
Wie der wert eines getters/setters zustande kommt kann man ändern, wenn
man eine Objekteigenschaft ändern/entfernen muss und von extern darauf
zugreift hat man ein Problem. Was den Artikel angeht, der hat schon ein
par gute Punkte, aber liest sich für mich als hätte der Author noch nie
von POJOs gehört, dessen nutzen wohl viele noch nicht erkannt haben.
Rolf M. schrieb:> Das erzwingt sich doch ganz von selbst, oder nicht? Wenn die Konstante> nicht definiert ist, gibt's beim Zugriff darauf einen Fehler.
Ja… Deshalb habe ich den Benutzernamen gewählt, weil ich manchmal so
dumme Gedankengänge habe. Ich habe mir gedacht, jedes abgeleitete Klasse
muss diese Konstante haben, also kommt sie in die Basisklasse…
Dann ist aber natürlich noch immer nicht sichergestellt, dass die
Konstante überhaupt genutzt wird, selbst wenn man dafür sorgt, dass sie
in den abgeleiteten Klassen gesetzt wird.
Aber dass man auch Funktionen abstrakt machen kann, war eine gute Idee.
Da hätte ich auch selber drauf kommen können, bin ich aber halt nicht…
D. I. schrieb:> Trotzdem ist an der Stelle die Frage ob es Sinn macht die gemeinsame> Funktionalität über ein eigenes Objekt via Dependency Injection> bereitzustellen.
Was wäre denn die Alternative? Die gleiche Funktion in jedes Unterobjekt
zu schreiben?
D. I. schrieb:> Vererbungshierachien kommen nicht selten mit> verringerter Wartbarkeit daher.
Es geht nur um eine Basisklasse und mehrere Unterklassen eine
'Generation' darunter, also keine langen Vererbungspfade.
Ich muss sagen, dass ich mit C++ aufgewachsen bin, deshalb habe ich
vielleicht auch eine andere Vorstellung von guter Vererbung.