Forum: PC-Programmierung Konstante und Funktion in abgeleiteter Klasse erzwingen


von Dussel (Gast)


Lesenswert?

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
virtual void Funktion()=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?

von Daniel A. (daniel-a)


Lesenswert?

Dein C++ Konstrukt sind pure virtual methods
Java equivalent wäre abstract: 
https://docs.oracle.com/javase/tutorial/java/IandI/abstract.html

Eine Konstanten setzen müssten einfach final sein, eventuell noch ein 
static davor.
1
final static constant = x

Auch cool ist sowas:
1
static int x;
2
static {
3
  int i;
4
  while( i < 100)
5
    i++;
6
  x = i;
7
}

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.

von Dussel (Gast)


Lesenswert?

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.

von Daniel A. (daniel-a)


Lesenswert?

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.

von Rolf M. (rmagnus)


Lesenswert?

Das erzwingt sich doch ganz von selbst, oder nicht? Wenn die Konstante 
nicht definiert ist, gibt's beim Zugriff darauf einen Fehler.

von D. I. (Gast)


Lesenswert?

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

von Mark B. (markbrandis)


Lesenswert?

Daniel A. schrieb:
> im Java hat sowieso alles getter und setter

Ob man getter und setter Methoden verwendet, ist eine Frage des 
Software-Designs. Nicht der Programmiersprache. Es gibt gute Gründe, 
getter und setter Methoden nicht als Standard überall zu verwenden.

http://www.javaworld.com/article/2073723/core-java/why-getter-and-setter-methods-are-evil.html

von Daniel A. (daniel-a)


Lesenswert?

@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.

von Dussel (Gast)


Lesenswert?

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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.