Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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

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.

 

 

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.

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.

vor 26 Minuten schrieb Whiz-zarD:

Davon gehe ich auch aus.
Deswegen schrieb ich ja, dass der Code schon Sinn macht, wenn das die bauen()-Methode sein soll.

ja bis auf die erste Zeile:)

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.

vor 42 Minuten schrieb Whiz-zarD:

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

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

du kannst keine instanz vom abstraktem typ Gebäude instanziieren

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.

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?

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.

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.