Idexe Geschrieben 4. Februar 2005 Geschrieben 4. Februar 2005 Hallo, erstens habe ich das Problem, dass ich den Sinn einer private Ableitung nicht 100% - ig verstehe. Zweitens verstehe ich den Sinn einer protected Ableitung überhaupt nicht. Ich habe oft gelesen, dass es keinen Sinn macht aber warum hat irgenwie keiner erklärt. Ich weiß es ist keine einfache Frage... Vielleicht kann jemand versuchen es zu erklären, oder wir werfen zumindest unser Wissen zusammen. Danke! Zitieren
Bubble Geschrieben 4. Februar 2005 Geschrieben 4. Februar 2005 Hallo, erstens habe ich das Problem, dass ich den Sinn einer private Ableitung nicht 100% - ig verstehe. Zweitens verstehe ich den Sinn einer protected Ableitung überhaupt nicht. Danke! "public", "private" und "protected" verändern die Sichtbarkeit von Klassenfunktionen und Klassenvariablen. Für ein gutes Design ist das zwingend, denn nur so können in einer Klasse z.B. Zustandsvariablen verborgen und ihre Änderung auf direktem Weg von außen verhindert werden. "protected" ist eine Abschwächung von "private" in der Hinsicht, dass abgeleitete Klassen vollen Zugriff haben, während "private" wirklich privat bedeutet und auch abgeleiteten Klassen keinen Zugriff haben. Genaueres bitte in einem Buch nachlesen, alles hier auf die Schnelle zu wiederholen lohnt IMO nicht Ich habe oft gelesen, dass es keinen Sinn macht aber warum hat irgenwie keiner erklärt. Das ist definitiv falsch, es ist sogar sehr sinnvoll für ein gutes Klassendesign! Ich würde sogar sagen: zwingend! Zitieren
Klotzkopp Geschrieben 4. Februar 2005 Geschrieben 4. Februar 2005 Das ist definitiv falsch, es ist sogar sehr sinnvoll für ein gutes Klassendesign! Ich würde sogar sagen: zwingend!Ich kann mir kein Beispiel vorstellen, bei dem durch protected-Ableitung ein gutes Klassendesign zustande kommt. Hast du eins? @Idexe: Für public- und private-Vererbung gibt es eine einfache Modellentsprechung. public-Vererbung stellt eine "ist ein"-Beziehung dar, private-Vererbung eine "ist implementiert mit Hilfe von"-Beziehung. Scott Meyers schreibt in "Effective C++", Item 35: [...] and no one seems to know what protected inheritance is supposed to mean. Schau mal in das Buch rein, ist sehr zu empfehlen. Besonders die Items 35 und 42 sind in dieser Beziehung interessant. Zitieren
Bubble Geschrieben 4. Februar 2005 Geschrieben 4. Februar 2005 Ich kann mir kein Beispiel vorstellen, bei dem durch protected-Ableitung ein gutes Klassendesign zustande kommt. Hast du eins? "protected" ist immer dann für Variablen und Funktionen sinnvoll, wenn Performance eine Rolle spielt oder wirklich nur abgeleitete Klassen auf interne Datenstrukturen zugreifen sollen, aber kein Benutzer der Klassenbibliothek von außen. Natürlich kann man darüber vortrefflich streiten, ich finde protected jedoch in vielen Fällen sinnvoll, da es für Erweiterungen durch Vererbung mehr Spielraum lässt ohne in den Code der Basisklasse selbst eingreifen zu müssen. Neuere Sprachen wie C# unterstützen noch sealed, wodurch man die letzte Klasse in seiner Hierarchie abschotten kann, so dass kein anderer Entwickler auf die Idee kommt sich durch Vererbung Zugriff auf interne Strukturen zu verschaffen. In C++ käme man dem am nächsten, indem man die letze Ableitung in der Kette mit "private" vor dem Namen der Basisklasse modifiziert. Vor dem Ableiten von Klassen weiter oben in der Hierarchie schützt es allerdings auch nicht. Kurzbeispiel (nicht vollständig ausformuliert): Klasse Bitmap mit einem protected Zeiger auf den Speicherblock mit den Bilddaten und Integers für Angaben wie z.B. Breite und Höhe. Abgeleitete Klassen wie "BitmapRLE" oder "BitmapJPEG" sollen darauf schnell zugreifen können (Bildinhalte neu setzen, Breite und Höhe des Bildes verändern), Verwender der Klassen (die eigentliche Anwendung) sollen jedoch Daten wie Breite und Höhe nur auslesen können und auf die Bitmap nur indirekten Zugriff (GetPixel Funktion) erhalten. Hier spricht IMO nichts gegen die Verwendung von protected, sie ist sogar erforderlich. Zitieren
Klotzkopp Geschrieben 4. Februar 2005 Geschrieben 4. Februar 2005 Bubble, es geht nicht um protected-Member oder -Methoden, es geht um protected-Vererbung: class Derived : [b]protected[/b] Base { ...[/code] Zitieren
Bubble Geschrieben 4. Februar 2005 Geschrieben 4. Februar 2005 Bubble, es geht nicht um protected-Member oder -Methoden, es geht um protected-Vererbung: class Derived : [b]protected[/b] Base { ... Der Gedanke kam mir auch grade, aber da war's Posting schon abgesetzt :hells: Das Feature ist in der Tat diskutiert, manche sagen es ist der Vollständigkeit halber erlaubt. Oder ein Feature mehr, dass, falls es einmal für ein Klassendesign nützlich ist, zur Verfügung steht. Letztlich kann man aber auch hier Fälle konstruieren in denen es Verwendung finden kann. Dies soll aber nicht bedeuten, dass man das gleiche Problem nicht auch anders lösen könnte. Eine durch Ableitung erfolgte Spezialisierung kann bisher zur Verfügung stehende Funktionen und Variablen überflüssig oder im neuen Zusammenhang sogar unlogisch machen. In dieser Hinsicht kann es sinnvoll sein sie zu verbergen. So kann es auch sein, dass auf die Daten einer vererbten Klasse nur mittels der Schnittstellen dieser Klasse zugegriffen werden soll. Zitieren
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.