Warum bricht 'protected' die Kapselung?



  • Nee, das mit dem "eigenen Objekt" (in C# - C++ nicht getestet) stimmt nicht.

    public class ClBase { 
        protected int foo; 
      }
    
      class ClDerived : ClBase { 
        public void bar() { foo = 42; } // erlaubt 
        public void bar(ClDerived d) { d.foo = 42; } // auch erlaubt 
      }
    

    Hier wird NICHT auf das eigene Objekt zugegriffen, wohl aber auf ein Objekt der eigenen Klasse, und nur so geht's.

    Aber mal allgemein: NATÜRLICH bricht protected die Kapselung, genau dafür ist es ja da. 😉

    Aber, zumindest in C#, kann man auch beides haben: Zugriff durch abgeleitete Klassen + Kapselung auf eigene Assembly... nämlich indem man "protected internal" verwendet. Damit hat man die Kapselung der Basisklasse gebrochen (beabsichtigt) und vermeidet einen Bruch der Kapselung der Assembly.



  • Asche auch auf mein Haupt. In C++ ist es auch so, steht auch so in §11.5.



  • Hi again,

    ich habe das irgendwie immernoch nicht so überrissen. Also, dass man durch die gezeigten Beispiele auf die 'protected'-Member zugreifen kann und sie sozusagen "illegal" mit beispielsweise einem Property veröffentlicht, ist mir klar.

    Aber was wäre dann die richtige Lösung, wenn ich in abgeleiteten Klassen, die 'private'-Member der Basisklasse brauche???
    Irgendwie brauch ich ja Zugriff auf diese!

    MfG und Grüße



  • NoPlan schrieb:

    Aber was wäre dann die richtige Lösung, wenn ich in abgeleiteten Klassen, die 'private'-Member der Basisklasse brauche???

    lesen oder schreiben?
    lesen: ein getter (bzw. in c# wohl eine property) in der basisklasse.
    schreiben: gar nicht, dafür ist 'protected' da. wenn du unbedingt musst, kannst du auch einen setter in die basisklasse schreiben, der dann aber u.u. wiederum die kapselung bricht.



  • private parts schrieb:

    lesen: ein getter (bzw. in c# wohl eine property) in der basisklasse.
    schreiben: gar nicht, dafür ist 'protected' da. wenn du unbedingt musst, kannst du auch einen setter in die basisklasse schreiben, der dann aber u.u. wiederum die kapselung bricht.

    protected ist nicht dazu da, Veränderung von Daten zu verhindern.



  • NoPlan schrieb:

    Aber was wäre dann die richtige Lösung, wenn ich in abgeleiteten Klassen, die 'private'-Member der Basisklasse brauche???
    Irgendwie brauch ich ja Zugriff auf diese!

    Auf "private" gibt's in C# keinen Zugriff, da es keine "friends" gibt.
    Also "protected".

    Allerdings....
    ...braucht man sowas eigentlich nicht sehr oft und
    ...kann man die jeweiligen Basisklassen dann fast immer "internal" machen, bzw. gibt es IIRC auch den "protected internal" Level, was meist ausreicht (denn im "eigenen" Modul kann man schonmal Dinge aufmachen/erlauben die nicht 100% deppensicher sind)

    EDIT: hihi, ok, das mit "protected internal" steht ja schon ein paar beiträge über diesem, sehe ich jetzt erst 🙂



  • Bashar schrieb:

    protected ist nicht dazu da, Veränderung von Daten zu verhindern.

    hm?

    private parts schrieb:

    NoPlan schrieb:

    Aber was wäre dann die richtige Lösung, wenn ich in abgeleiteten Klassen, die 'private'-Member der Basisklasse brauche???

    schreiben: gar nicht, dafür ist 'protected' da.

    lies: wenn du die variable ändern musst, mach sie protected.



  • private parts schrieb:

    Bashar schrieb:

    protected ist nicht dazu da, Veränderung von Daten zu verhindern.

    hm?

    Protected ist dazu da die Veraenderung der Daten zu erlauben.
    Private ist fuer die verhinderung.



  • private parts, du hast doch geschrieben:

    lesen: ein getter[...]
    schreiben: gar nicht, dafür ist 'protected' da.

    Da lese ich "protected heißt, dass schreiben (auch durch einen setter) tabu ist" raus. Du hättest "schreiben: ein setter" schreiben müssen, wenn es anders gemeint wäre.



  • Bashar schrieb:

    Da lese ich "protected heißt, dass schreiben (auch durch einen setter) tabu ist" raus. Du hättest "schreiben: ein setter" schreiben müssen, wenn es anders gemeint wäre.

    ok, akzeptiert. ich wollte ausdrücken, dass es zwar mit einem setter geht, aber man es sich überlegen sollte, statt dessen einfach gleich 'protected' zu nehmen. setter und getter für den zugriff auf variablen sind nämlich bäh und brechen die kapselung genauso wie protected.


Anmelden zum Antworten