rasenganIT Geschrieben 23. November 2023 Teilen Geschrieben 23. November 2023 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
pr0gg3r Geschrieben 23. November 2023 Teilen Geschrieben 23. November 2023 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Whiz-zarD Geschrieben 24. November 2023 Teilen Geschrieben 24. November 2023 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
carnaqe Geschrieben 24. November 2023 Teilen Geschrieben 24. November 2023 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Whiz-zarD Geschrieben 24. November 2023 Teilen Geschrieben 24. November 2023 Davon gehe ich auch aus. Deswegen schrieb ich ja, dass der Code schon Sinn macht, wenn das die bauen()-Methode sein soll. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
carnaqe Geschrieben 24. November 2023 Teilen Geschrieben 24. November 2023 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:) Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Whiz-zarD Geschrieben 24. November 2023 Teilen Geschrieben 24. November 2023 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
carnaqe Geschrieben 24. November 2023 Teilen Geschrieben 24. November 2023 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Whiz-zarD Geschrieben 24. November 2023 Teilen Geschrieben 24. November 2023 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. rasenganIT reagierte darauf 1 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Whiz-zarD Geschrieben 24. November 2023 Teilen Geschrieben 24. November 2023 (bearbeitet) gelöscht. Bearbeitet 24. November 2023 von Whiz-zarD Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
carnaqe Geschrieben 24. November 2023 Teilen Geschrieben 24. November 2023 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? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
stefan.macke Geschrieben 24. November 2023 Teilen Geschrieben 24. November 2023 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. rasenganIT reagierte darauf 1 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
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.