toegang tot privéveld van een ander object in dezelfde klas

Vergeet het ontwerp. Ik weet dat Oop specificeert dat privé-objecten privé zijn voor de klas. Mijn vraag is, waarom was OOP zodanig ontworpen dat privévelden toegang hebben tot classive-level en geen toegang tot objectniveau ?


1, Autoriteit 100%

Ik ben ook een beetje nieuwsgierig met het antwoord.

Het meest bevredigende antwoord dat ik vind, is van artemix in een andere post hier (ik hernoem de aclass met persoonsklasse):
Waarom toegang tot class-level-niveau-modifiers in plaats van objectniveau ?

De particuliere modifier dwingt inkapselingsbeginsel.

Het idee is dat ‘Buitenwereld’ geen wijzigingen in de interne processen van de persoon zou moeten aanbrengen, omdat de implementatie van de persoon in de loop van de tijd kan veranderen (en u zou de hele buitenwereld moeten wijzigen om de verschillen in implementatie op te lossen – wat bijna onmogelijk is) .

Wanneer een persoon van persoon internationale instantie toegankelijk is – u kunt er zeker van zijn dat beide instanties altijd de details van de implementatie van persoon kennen. Als de logica van interne tot persoonsprocessen wordt gewijzigd – alles wat u hoeft te doen is de persoon van persoon wijzigen.

EDIT:
Alsjeblieft Stem Artemix ‘Antwoord. Ik ben gewoon kopieer het.


2, Autoriteit 32%

Goede vraag. Het lijkt erop dat de toegangsmodificator voor objectniveau het inkapselingsbeginsel nog verder zou afdwingen.

Maar eigenlijk is het andersom. Laten we een voorbeeld nemen. Stel dat u een object in een constructor wilt kopiëren, als u geen toegang hebt tot de particuliere leden van dat object. Dan is de enige mogelijke manier om een ​​aantal openbare toevoegers toe te voegen aan alle particuliere leden. Dit maakt uw objecten naakt naar alle andere delen van het systeem.

Dus inkapseling betekent niet dat ze worden gesloten voor de hele rest van de wereld. Het betekent selectief zijn over wie u open wilt staan.


3, Autoriteit 21%

Zie de Java Taal Specificatie, sectie 6.6.1. Bepalen van toegankelijkheid

Het stelt

anders, als het lid of de constructeur wordt gedeclareerd private, dan
Toegang is toegestaan ​​als en alleen als het zich voordoet in het lichaam van de
Hoogste niveauklasse (§ 7.6) die de verklaring van het lid of bijsluit
constructeur.

Klik op de bovenstaande link voor meer details. Dus het antwoord is: omdat James Gosling en de andere auteurs van Java besloten om die manier te zijn.


4

Alleen mijn 2 cent op de vraag waarom de semantiek van de private zichtbaarheid in Java klasniveau is in plaats van objectniveau.

Ik zou zeggen dat gemak lijkt de sleutel hier te zijn. In feite zou een privézichtbaarheid op objectniveau hebben gedwongen methoden bloot te stellen aan andere klassen (bijvoorbeeld in hetzelfde pakket) in het scenario geïllustreerd door het OP.

In werkelijkheid was ik niet in staat om geen van beide een voorbeeld te vinden, tonen dat de zichtbaarheid bij klasse-privéniveau (zoals aangeboden door Java) eventuele kwesties creëert in vergelijking met zichtbaarheid op object-privéniveau.

Dat gezegd hebbende, programmeertalen met een meer fijnkorrelig systeem van zichtbaarbeleid, kan het zicht van het object zichtbaar maken op objectniveau en klasniveau.

Bijvoorbeeld Eiffel , biedt selectieve export: u kunt elke klasse-functie exporteren Naar elke klas van uw keuze, van {Geen} (Object-private) tot {every} (het equivalent van het publiek en ook de standaard), tot {persoon} (klasse-privé, zie het voorbeeld van de op specifieke groepen) van klassen {persoon, bank}.

Het is ook interessant om op te merken dat je in Eiffel niet nodig hebt om een ​​attribuut privé te maken en een getter te schrijven om te voorkomen dat andere klassen eraan toewijzen. Openbare kenmerken in Eiffel zijn standaard toegankelijk in de alleen-lezen-modus, dus u hebt geen Getter nodig om hun waarde terug te sturen.

Natuurlijk heb je nog steeds een setter nodig om een ​​attribuut in te stellen, maar je kunt het verbergen door het te definiëren als “Assigner” voor dat attribuut. Hiermee kunt u, als u wenst, om de meer handige opdrachtoperator te gebruiken in plaats van de Setter-aanwijzing.


5

Omdat de privateAccess Modifier maakt het alleen zichtbaar binnen de Class . Deze methode is nog in de klas .


6

De privateVeld is toegankelijk in de klas / object waarin het veld wordt gedeclareerd. Het is privé voor andere klassen / objecten buiten de een die zich bevindt.


7

Eerste ding hier moeten we begrijpen, is alles wat we moeten doen is OOPS-principes moeten volgen, zodat inkapseling zegt dat wikkelgegevens binnen pakket (dwz klasse) wikkelen en dan alle gegevens als object en gemakkelijk te gebruiken vertegenwoordigen. Dus als we een veld maken als niet-privé dan
Het is onduidelijk toegankelijk. en het resulteert in slechte paratice.


8

Met reflectieconcept in Java is mogelijk Modify-velden en -methoden PRIVATES

Modificando Metodos Y Campos Privados Con Reflecion en Java

Other episodes