Zum Inhalt springen

Abstrakte Methode, Klassen - Verständnisfrage


Empfohlene Beiträge

Hallo wenn ich auf die Methode "planen" und "fundamentBauen"  zugreifen will kann ich dann ja über die Methode bauen es machen:

 

1) Gebäude bauen (anzahl):

    Gebäude neuesGebäude = planen(anzahl)
    neuesGebäude.fundamentBauen()
    return neuesGebäude

Das ist doch nur möglich weil fundamentBauen() von Gebäude erbt durch die Klasse "Wohngebäude" und die Klasse "Wohnbau" hat eine Beziehung zu "Wohngebäude" mit der implementierten abstrakten Methode "planen" aus Hochbau. Und weil planen Gebäude als Rückgabetyp hat.

 

 

 

 

Screenshot from 2023-11-23 19-50-57.png

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 39 Minuten schrieb rasenganIT:

Das ist doch nur möglich

Nein das ist so nicht möglich.

vor 39 Minuten schrieb rasenganIT:

Gebäude neuesGebäude [...]

Du kannst keine abstrakte Klasse instanziieren.

vor 39 Minuten schrieb rasenganIT:

[...] neuesGebäude = planen(anzahl)

Du kannst keiner Instanz (neuesGebäude) eine Methode (planen()) zuweisen (=).

Was du machen kannst ist in deiner Funktion eine Instanz zu erzeugen, die die abstrakte Klasse implementiert und die abstrakte Klasse durchaus als Rückgabewert deiner Funktion deklarieren.

 

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 10 Stunden schrieb pr0gg3r:

Du kannst keine abstrakte Klasse instanziieren.

Du kannst keiner Instanz (neuesGebäude) eine Methode (planen()) zuweisen (=).

Es wird auch keine abstrakte Klasse instanziiert, sondern planen() hat als Rückgabetyp Gebaeude.

Allerdings werde ich aus diesem Klassendiagram nicht schlau. z.B. ist Buerobau ja von Buerogebaeude strukturell abhängig. Das bedeutet, dass Buerobau eine Instanzvariable von Buerogebaeude haben muss. Ich denke aber eher, dass hier eine allgemeine Abhängigkeit gemeint ist, weil bauen() und planen() jeweils eine Instanz von Typ Gebaeude zurückgeben und daher die Linie gestrichelt sein müsste (darum hasse ich Klassendiagramme).

Darum ist planen() auch abstrakt, weil planen() eine konkrete Instanz vom Typ Gebaeude (Buerogebaeude, Wohngebaeude) erstellt. wenn dann der Code:

vor 11 Stunden schrieb rasenganIT:

Gebäude neuesGebäude = planen(anzahl)
neuesGebäude.fundamentBauen()
return neuesGebäude

die Methode bauen() sein soll, dann macht der Code durchaus Sinn.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 2 Stunden schrieb Whiz-zarD:

Es wird auch keine abstrakte Klasse instanziiert, sondern planen() hat als Rückgabetyp Gebaeude.

Allerdings werde ich aus diesem Klassendiagram nicht schlau. z.B. ist Buerobau ja von Buerogebaeude strukturell abhängig. Das bedeutet, dass Buerobau eine Instanzvariable von Buerogebaeude haben muss. Ich denke aber eher, dass hier eine allgemeine Abhängigkeit gemeint ist, weil bauen() und planen() jeweils eine Instanz von Typ Gebaeude zurückgeben und daher die Linie gestrichelt sein müsste (darum hasse ich Klassendiagramme).

Darum ist planen() auch abstrakt, weil planen() eine konkrete Instanz vom Typ Gebaeude (Buerogebaeude, Wohngebaeude) erstellt. wenn dann der Code:

die Methode bauen() sein soll, dann macht der Code durchaus Sinn.

wahrscheinlich liefert die methode bauen die instanzvariable, welche vorher über planen eine instanz grbäude zugewiesen bekommen hat.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 55 Minuten schrieb carnaqe:

ja bis auf die erste Zeile:)

Und warum nicht? Genau da passiert doch, was du schreibst:

vor einer Stunde schrieb carnaqe:

wahrscheinlich liefert die methode bauen die instanzvariable, welche vorher über planen eine instanz grbäude zugewiesen bekommen hat.

Es wird planen() aufgerufen, die uns eine Instanz von einem Gebäude zurückgibt.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 3 Minuten schrieb carnaqe:

du kannst keine instanz vom abstraktem typ Gebäude instanziieren

Das macht planen() auch nicht, sondern gibt den konkreten Typ zurück aber macht einen Upcast auf seine Elternklasse.

Darum ist planen() ja auch abstrakt und muss konkret in den Klassen Buerobau und Wohnbau implementiert werden und deswegen gibt es im Klassendiagram auch den Pfeil auf die Klassen Buerogebaeude/Wohngebaeude.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 55 Minuten schrieb Whiz-zarD:

Das macht planen() auch nicht, sondern gibt den konkreten Typ zurück aber macht einen Upcast auf seine Elternklasse.

Darum ist planen() ja auch abstrakt und muss konkret in den Klassen Buerobau und Wohnbau implementiert werden und deswegen gibt es im Klassendiagram auch den Pfeil auf die Klassen Buerogebaeude/Wohngebaeude.

okay, wieder was gelernt. Was macht es für einen Sinn, eine Referenz einer abstrakten klasse auf eine erbende klasse zeigen zu lassen?

bwz. was ist der Vorteil davon, als gleich eine Referenz auf eine abgeleitete Klasse zu nehmen welche ja alles erbt und implementieren muss und welche ja dank Polymorphie genauso herumgereicht werden kann?

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 45 Minuten schrieb carnaqe:

bwz. was ist der Vorteil davon, als gleich eine Referenz auf eine abgeleitete Klasse zu nehmen welche ja alles erbt und implementieren muss und welche ja dank Polymorphie genauso herumgereicht werden kann?

Du wiedersprichst dir selbst. Polymorphie funktioniert nur, wenn du als Referenz die Basisklasse nutzt und sich dahinter die Subklasse "verbirgt". Gebaeude g = new Wohngebaeude(); geht.

Wenn du als Referenz aber die Subklasse verwendest, kannst du eben nicht die Basisklasse stattdessen verwenden. Wohngebaeude w = new Gebaeude(); geht nicht (wenn wir mal davon ausgehen, dass Gebaeude instanziiert werden kann).

Im obigen Beispiel wird übrigens das Design Pattern "Abstract Factory" implementiert, das genau zum Zweck hat, die konkreten Subklassen, die die tatsächliche Implementierung enthalten, vor der Außenwelt zu verbergen, die nur die abstrakten Basisklassen kennen. Das ist quasi gelebte Polymorphie.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...