Java - Vererbung?


11.01.2021, 11:00

Hallo zusammen, 

wir haben folgende Aufgabe bekommen und ich benötige ein wenig Hilfe bei den Aufgaben. 

b) Kann ein Wecker einen Elektroantrieb haben? 

Ein Wecker kann laut Klassendiagramm auf die Klasse Uhr zugreifen. Die Klasse Uhr weist eine Assoziation zu Antrieb auf. Kann man daher auf den Elektroantrieb zugreifen? 

Wir sind ganz neu in diesem Thema und würden uns daher über eine Hilfe freuen. 

Quelle des Bilds: Ehmann, M. u.a.: Informatik. Objektorientierte Programmierung mit BlueJ. 1. Auflage, Duden-Verlag, S. 139.

DerEinsiedler  11.01.2021, 11:04

Ein Wecker ist eine Uhr. ("ist" ist die Vererbung)

Jede Uhr hat einen Antrieb.

Ein Elektroantrieb ist ein Antrieb.

Daraus folgt, dass ein Wecker einen Elektroantrieb haben kann.

max456892 
Beitragsersteller
 11.01.2021, 14:49

Danke dir. Und welche Attribute/Methoden hat dann bspw. ein Wecker? Seine eigenen +die von Uhr und weitere? Das verstehe ich nicht ganz.

3 Antworten

Ja. Es ist heutzutage sogar üblich, dass ein Wecker elektrisch funktioniert. Meistens mit einer digitalen Anzeige. Ich hab als Kind bei meinen Großeltern manchmal mit einem mechanischen Wecker gespielt, den sie einige Jahre vor meiner Geburt in die Abstellkammer verbannt haben, weil sie ihn durch einen elektrischen Wecker ersetzt haben.

Was aber an der Aufgabenstellung viel interessanter ist: Pendeluhren haben in der Regel weder einen elektrischen noch einen Federantrieb, sondern werden meistens mit Gewichten angetrieben. Pendeluhren mit Elektroantrieb gibt es nicht. Bzw. es gibt nur welche, die elektrisch die Feder aufziehen bzw. die Gewichte hochziehen können oder welche, bei denen das Pendel nur Deko ist und unabhängig vom Uhrwerk läuft.


daCypher  11.01.2021, 13:13

PS: Ich hab glaub ich die Frage falsch verstanden. Du wolltest nicht wissen, ob es realistisch ist, dass Wecker einen Elektroantrieb haben, sondern ob du laut dem Klassendiagramm ein Objekt vom Typ "Wecker" mit einem Objekt vom Typ "Elektroantrieb" verknüpfen kannst.

Das geht in dem Fall über die Vererbung. Der Wecker erbt von der Klasse "Uhr", dass er einen Antrieb hat. Du kannst ein Objekt vom Typ Antrieb mit einem Konstruktor von Elektroantrieb erzeugen und das dem Wecker zuweisen. Kannst dann aber z.B. nicht die Methode batterieWechseln() direkt aus dem Wecker aufrufen.

Antrieb eAntrieb = new Elektroantrieb();
Wecker wecker = new Wecker(eAntrieb);
0
max456892 
Beitragsersteller
 11.01.2021, 14:47
@daCypher

Genau, der zweite Kommentar ist richtig verstanden. Vielen Dank!

0
Ein Wecker kann laut Klassendiagramm auf die Klasse Uhr zugreifen.

Nein. Laut Klassendiagramm ist Wecker eine Spezialisierung von Uhr. Mit "zugreifen" hat das nichts zu tun.

Weil aber Uhr mit Antrieb über die hat-Relation assoziiert ist, und Elektroantrieb eine Spezialisierung von Antrieb ist, kann ein Wecker einen Elektroantrieb haben.

Anders ausgedrückt: ein Wecker ist eine Uhr, eine Uhr hat einen Antrieb, ein Elektroantrieb ist ein Antrieb. Ergo kann ein Wecker einen Elektroantrieb haben.


max456892 
Beitragsersteller
 11.01.2021, 12:26

Genau so dachte ich das auch. Konnte nur nicht die richtigen Worte dafür finden, danke! Das hilft enorm weiter!

0

Ein Wecker ist eine Uhr. ("ist" ist die Vererbung)

Jede Uhr hat einen Antrieb.

Ein Elektroantrieb ist ein Antrieb.

Daraus folgt, dass ein Wecker einen Elektroantrieb haben kann.


max456892 
Beitragsersteller
 11.01.2021, 15:14

Werden die Eigenschaften und Attribute dann sozusagen von Antrieb und Uhr auf Wecker übertragen?

0
DerEinsiedler  11.01.2021, 15:28
@max456892

Nein.

Du hast 2 Möglichkeiten das Diagramm in Java-Code umzusetzen:

a) Eine Uhr bekommt ein Attribut vom Typ Antrieb

b) Eine Uhr bekommt ein Attribut, das irgendwie auf einen Antrieb verweist (z.B. eine Id)

Ich würde normal a) bevorzugen. Jemand der das in eine Datenbank schreiben will vielleicht eher b) :-)

In dem Fall ist es dann so:

Der Wecker ist eine Uhr. Diese hat einen Attribut vom Typ Antrieb. Zur Laufzeit kann dieses Attribut dann Objekte vom Typ Antrieb, Elektroantrieb oder Federantrieb aufnehmen.

Es ist also zum Progarmmierzeitpunkt offen, ob es vom Typ Elektroantrieb sein wird.

wecker.Antrieb.laufleistung kannst Du also immer aufrufen.

wecker.Antrieb.aufziehen() kannst Du nur aufrufen, wenn das Ding einen Federantrieb bekommen hat.

0
max456892 
Beitragsersteller
 11.01.2021, 15:32
@DerEinsiedler

Danke für deine Mühe! Ich soll allerdings nur auf einen Zettel schreiben, welche Attribute und welche Methoden nun zu "Wecker" gehören, würde also sagen: die von Wecke + die von Uhr + die von Antrieb. Ist das an dieser Stelle korrekt?

0
DerEinsiedler  11.01.2021, 15:35
@max456892

Das ist Ansichtssache.

Ich würde sage eins dieser beiden:

  • die von Wecker + die von Uhr
  • die von Wecker + die von Uhr + das Attribut Antrieb (aber nicht die Attribute/Methoden von Antrieb)
0
max456892 
Beitragsersteller
 11.01.2021, 15:39
@DerEinsiedler

OK!
Und wenn man nun die Batterie des Weckers wechseln möchte, wie kann man das dann als Code umsetzten (also nur die reine Methode)?

0
DerEinsiedler  11.01.2021, 16:35
@max456892

Unter der Annahme, dass Du einen Elektroantrieb hast:

Uhr uhr = new Wecker();
uhr.Antrieb = new Elektroantrieb();
uhr.Antrieb.BatterieWechseln();
0
max456892 
Beitragsersteller
 11.01.2021, 20:24
@DerEinsiedler

Wenn man bspw. nun eine Objektkarte von einem Wecker mit einem Elektroantrieb skizzieren will, übernehme ich ja die Eigenschaften und Methoden der Klasse Wecker und Uhr. Aber auch die von "Antrieb" und Wecker?

0
max456892 
Beitragsersteller
 14.01.2021, 15:33
@DerEinsiedler

Hallo nochmal. Wieso darf man in der zweiten Zeile "Antrieb" großschreiben bzw. sich auf diese Klasse beziehen?

0
max456892 
Beitragsersteller
 14.01.2021, 15:43
@max456892

Bzw. in welcher Klasse ist diese Methode zu verbauen?

0
DerEinsiedler  14.01.2021, 15:46
@max456892

Das Attribut Antrieb gehört natürlich in die Klasse Uhr. Sonst kann man das auch nicht so aufrufen.

Du kannst das Attribut auch klein schreiben, wenn Ihr das so macht.

In C# würde man das als sogenanntes "Propery" großschreiben (weil man Attribute normal nicht direkt nach außen sichtbar macht)

0
max456892 
Beitragsersteller
 14.01.2021, 15:48
@DerEinsiedler

Wow, danke für die schnelle Antwort. Wir nutzten BlueJ. Würde dann oben in der Deklarierung der Instanzvariablen "protected Antrieb antrieb" in "Uhr" und dort dementsprechend die Methode anpassen.

0
max456892 
Beitragsersteller
 14.01.2021, 15:56
@max456892

Wie kann man denn in der Objektkarte diese Objektreferenzvariable "antrieb" berücksichtigen"? Normalerweise würde man ja die Eigenschaften mit Werten versehen, also "bezeichnung = wecker1"

0
DerEinsiedler  14.01.2021, 16:33
@max456892

"Objektkarte" sagt mir jetzt nichts :)

In dem Diagramm ist der Antrieb über die "hat"-Beziehung eingetragen

0
DerEinsiedler  11.01.2021, 15:14

>> Danke dir. Und welche Attribute/Methoden hat dann bspw. ein Wecker? Seine eigenen +die von Uhr und weitere? Das verstehe ich nicht ganz.<<

Eine Kindklasse (Wecker) hat immer alle Attribute/Methoden der Vaterklasse (Uhr), weil die Instanzen der Kindklasse auch gleichzeitig Instanzen der Vaterklasse sind (Ein Wecker ist eine Uhr). Zusätzlich haben sie dann noch eigene zusätzliche Attribute/Methoden. Man sagt auch: Die Kindklasse erweitert die Vaterklasse.

0
max456892 
Beitragsersteller
 11.01.2021, 15:18
@DerEinsiedler

Okay, das ist soweit verstanden. Aber die Kindklasse Uhr erbt nicht von Antrieb? Mir wurde gesagt, man könne auf die indirekt zugreifen.

0