Private versus protected

Tags:    diverse

Jeg har i den seneste tid arbejdet på at udvikle min egen kontrol nedarved fra en tabkontrol. I den tid har jeg været nødt til at ændre access modifier'en på en hel masse metoder og members fra private til protected.

For at undgå misforståelser, gælder følgende i mit tilfælde:

Private er, at en metode eller member kun kan tilgås af den klasse, de er defineret i.

Protected er, at en metode eller member kun kan tilgås af den klasse, de er defineret i - eller klasser nedarvet derfra.

Hvornår bør man bruge private, og hvornår bør protected bruges? I mit tilfælde var jeg virkelig træt af private, fordi jeg ikke kunne tilgå disse members fra den nedarvede klasse. Hvornår er private en fordel? Eksempler?



well protected bør bruges når du samtidig anvender nedarvning :) ellers bør du bruge private. Umiddelbart kan jeg dog ikke se noget galt i at bruge protected, andet end princippet i det. Ret mig gerne hvsi jeg tager fejl :)



ville det ikke være ret dårligt at kode en klasse med antagelse af om den i fremtiden skulle nedarves eller ikke?

Ville da mene det var mere logisk at man privated alt det som men under ingen omstændigheder vil have andre til at tilgå, og protected alt som klassen og nedarvinger skal kunne til gå og published resten.

f.eks. hvis du lavede en klasse der talte et eller andet. ved at opdatere en tæller, ville du formentlig private skrivningen til tælleren. ville ikke være vildt sjovt hvis den begyndte at tælle forkert. men læsningen kunne gøres protected eller private.

Det er et tænkt eksemple har aldrig set en koden for en klasse der talte ting.



I C++ har man en række nært beslægtede class'er til operere på filer og andre "streams". Disse class'er har (sandsynligvis) en række private members som man ikke kan tilgå. Dette er gjort for at man ikke:
1: Får access til class'ens intene variabler og dermed risikerer at smadre filen og/eller filsystemet.
2: Tror at disse er en del af class'ens interface.
Det samme gælder for f.eks. containere.

Der er to måder at bruge en class:
1: Ved at lave et objekt af class'en, man siger at man har et object af class'en.
2: Man arver fra class'en, man siger man er class'en.

I det første tilfælde bruger man objektet som det er, og bruger kun de public members.
I det andet tilfælde laver man en special udgave af class'en, og har derfor måske brug for flere af class'ens interne funktioner og members, dem der er protected.
De private members er dem som man ikke vil lade andre rode i.

Det kræver en del erfaring at vide hvornår det er det ene eller det andet, men med tiden bliver det lige som at køre på cykel, det giver sig selv.



f.eks. hvis du lavede en klasse der talte et eller andet. ved at opdatere en tæller, ville du formentlig private skrivningen til tælleren. ville ikke være vildt sjovt hvis den begyndte at tælle forkert. men læsningen kunne gøres protected eller private.


Men hvad nu hvis en nedarvet klasse skulle påvirke tælleren ved at tælle på en anden måde?



Indlæg senest redigeret d. 21.12.2006 10:12 af Bruger #6653
Den nedarvede class skal ofte have lov til at påvirke tælleren på en mere fleksibel måde end normale brugere af class'en.

Derfor er der måske nogle "måder" som den afledte class kan få lov til at bruge, men som normale brugere ikke kan få adgang til. Disse "måder" er protected, ikke private.

Men forestil dig en gate der styrrer adgang til en kø. class'en der implementerer denne gate har en tæller der tæller antal objekter i kø, end ikke class'er der arver fra base class'en skal have lov til at påstå at der er færre eller flere objekter i kø, end der virkelig er, derfor er denne tæller private.



t