nyilvános, magán és védett hozzáférés – minden programozó ismeri ezt a koncepciót. Semmi különös, naponta dolgozunk velük. Ruby programozóként azonban valóban ismerjük a részleteket?
ezzel az öt állítással ellenőrizheti magát. Próbáljon válaszolni: igaz vagy hamis.
állítások:
- a nyilvános módszereknek nincs hozzáférés – az osztálydefiníción kívülről hívhatók az adott osztály példánya vagy alosztályai.
- mind a védett, mind a privát metódusok nem hívhatók meg a meghatározó osztály kívülről.
- a Védett módszerek az alosztályból érhetők el, a privát módszerek pedig nem.
- a meghatározó osztály privát metódusai az adott osztály bármely példányával meghívhatók.
- a nyilvános hozzáférés az alapértelmezett.
a cikk végén visszatérünk a helyes válaszokhoz. Most menjünk mélyebben a nyilvános, magán és védett hozzáférés-vezérlés néhány árnyalatába. Hogy praktikusabb legyen, elkészítettem a minta kódot, amellyel játszani lehet. Azt javaslom, hogy klónozza ezt a repót, hogy megkönnyítse a cikk folytatását. Ez csak egy akta. Ha először a megoldásra szeretne gondolni, akkor tartsa vissza a kód futtatását.
itt van a minta kód:
class Region attr_accessor :name def initialize(name, population, area_size, continent) self.name = name self.population = population self.area_size = area_size self.continent = continent end def greeting puts name_info + population_info end def more_densely_populated?(other_region) result = population_density > other_region.population_density ? 'more' : 'less' puts "#{name} is #{result} densely populated than #{other_region.name}." end def the_same_continent?(other_region) if continent.eql?(other_region.continent) puts "#{name} and #{other_region.name} lie in the same continent." else puts "#{name} and #{other_region.name} lie in the different continents." end end def can_be_crowdy? if self.consider_as_densely_populated? puts "#{name} can be crowdy." else "There is enough space in the #{name}." end end protected attr_accessor :continent def name_info "Hello, I'm #{name}!" end private attr_accessor :population, :area_size def population_info " #{population} people live here." end def population_density population / area_size end def consider_as_densely_populated? population_density > self.class::HIGH_POPULATION_DENSITY endendclass Country < Region HIGH_POPULATION_DENSITY = 300 def own_greeting puts "The country name: #{name}." + population_info endendclass City < Region HIGH_POPULATION_DENSITY = 3000 def own_greeting puts name_info + " The population: #{population} people." endend# initializationwroclaw = City.new('Wrocław', 638_000, 293, 'Europe')san_francisco = City.new('San Francisco', 884_000, 121, 'Northern America')poland = Country.new('Poland', 38_000_000, 312_000, 'Europe')# I sectionwroclaw.greetingpoland.greeting# II sectionwroclaw.name_infowroclaw.population_info# III sectionwroclaw.own_greetingpoland.own_greeting# IV sectionwroclaw.more_densely_populated?(san_francisco)wroclaw.the_same_continent?(san_francisco)san_francisco.can_be_crowdy?
láthatjuk az alap osztály Region
itt együtt két gyermek osztályok: Country
és City
City
és Country
örökölni Region
. Az öröklés a nyilvános, magán és védett részletek bemutatására szolgál. A fájl végén megtalálhatjuk az inicializálási részt és az 4 szakaszokat, amelyeket az alábbiakban tárgyalunk. Vessen egy pillantást a fájlra, hogy megismerje a kódot.
Ok, kezdjük! Az inicializálás 3. szakaszában a következő objektumok jönnek létre: wroclaw
san_francisco
és poland
. Ezeket az objektumokat demonstrációs célokra használják a következő szakaszokban. Azt javaslom, hogy ezeket a szegmenseket külön kezeljük. Kommentálhatja az adott részt, mielőtt a következőre lépne. Ily módon a hibák nem blokkolják a kimenet többi részét.
I szakasz
téma: nyilvános hozzáférés.
az első szakaszban agreeting
metódust kétszer hívják meg: awroclaw
és apoland
objektumokkal. Semmi különös itt. A nyilvános hozzáférés egyszerű. A greeting
elérhető az osztály objektumához (poland
) és a gyermekosztály objektumához (wroclaw
).
Hello, I'm Wrocław! 638000 people live here.Hello, I'm Poland! 38000000 people live here.
következtetés: a nyilvános hozzáférés nyilvánvaló és intuitív. Nincsenek korlátozások. Ezenkívül ez az Alapértelmezett hozzáférési módosító.
II szakasz
téma: hozzáférés a privát és védett metódusokhoz a meghatározó osztályon kívülről.
ebben a szakaszban két fontos módszer létezik: védett name_info
és privát population_info
. Az eredmény ismét intuitívnak tűnik. wroclaw
az objektumnak nincs hozzáférése sem a privát, sem a védett módszerekhez. Mindkét esetbenNoMethodError
dobásra kerül.
protected method `name_info' called for #<City:0x...> (NoMethodError)private method `population_info' called for #<City:0x...> (NoMethodError)
következtetés: a privát és védett módszerek nem hívhatók meg az osztály kívülről. A hozzáférés korlátozott.
III szakasz
téma: hozzáférés a privát és védett módszerekhez a meghatározó osztály belsejéből.
ezúttal van City::own_greeting
amely örökölt védett módszert használ belül (name_info
) és Country::own_greeting
amely örökölt privát módszert használ belül (population_info
). Mind a magán, mind a védett módszerek (még akkor is, ha öröklődnek) elérhetők az osztályon belül. Tehát nem az a lényeg, amely megkülönbözteti a privátot a védett hozzáféréstől.
Hello, I'm Wrocław! The population: 638000 people.The country name: Poland. 38000000 people live here.
következtetés: privát és védett módszerek hívhatók a meghatározó osztály belsejéből. Hozzáférés megengedett.
IV szakasz
téma: tényleges különbség a magán és a védett módszerek között.
IV szakasz – itt több váratlan szabály is megjelenhet.3 nyilvános módszert láthat ott:
-
more_densely_populated?(other_region)
– privátpopulation_density
belül. the_same_continent?(other_region)
– védettcontinent
belül.can_be_crowdy?
– privátconsider_as_densely_populated?
belül.
menjünk át a kódon lépésről lépésre:
more_densely_populated?(other_region)
wroclaw.more_densely_populated?(san_francisco)=> private method `population_density' called for #<City:0x...> (NoMethodError)
Hmm, ez érdekes. Privát módszer Region::population_density
nem lett meghívva, annak ellenére, hogy a Region
osztályon belül valósul meg. A hasonló forgatókönyv dolgozott a III szakaszban …
the_same_continent?(other_region)
wroclaw.the_same_continent?(san_francisco)=> Wrocław and San Francisco lie in the different continents.
Ez működik. Van különbség? Jobb, the_same_continent?
védett attribútumot használ – continent
. Oké, folytassuk.
can_be_crowdy?
san_francisco.can_be_crowdy?=> private method `consider_as_densely_populated?' called for #<City:0x...> (NoMethodError)
NoMethodError
ismét. Hmm, can_be_crowdy?
privát consider_as_densely_populated?
módszert is használ. Hasonló helyzet jól működött a III. Szóval mi folyik itt?
minden a vevőről szól.
alapvetően a Vevő az az objektum, amelynek metódusát meghívják. Menjünk egyenesen a példákhoz:
-
other_region.population_density ?
– a vevőother_region
. other_region.continent
– a vevőother_region
.self.consider_as_densely_populated?
– a vevőself
.
és itt van a fontos dolog, ne feledje, hogy a szabály:
privát módszerek nem hívhatók meg explicit Vevővel.
itt figyeljen az “explicit” szóra. Az utasítás egyszerűsítése – nem hívhat privát módszert a meghívás ilyen írásával – object.some_method
. Tiszta some_method
kell használni. Ez utóbbi esetben a Ruby az implicit vevőt használja, amely mindig self
. Ettől függetlenül még mindig nem hívhatsz privát metódust self.some_method
, mert még mindig explicit Vevő, a szabályok pedig szabályok:)
visszatérve a módszereinkhez:
-
other_region.population_density ?
– az explicit vevő jelen van, és a módszer privát –NoMethodError
-
other_region.continent
– az explicit vevő jelen van, és az attribútum védett – OK -
self.consider_as_densely_populated?
– az explicit vevő jelen van, és a módszer privát –NoMethodError
következtetés: ez a tényleges különbség a privát és a védett között. A privát módszerek nem hívhatók meg explicit vevővel, a védettek pedig igen. Tapasztalataim alapján a Ruby kódsorok között ritkán használnak védett módszereket, de hasznosak lehetnek a paraméterek összehasonlításakor, például amikor korlátozni akarjuk az attribútumhoz való hozzáférést, de továbbra is használni akarjuk az összehasonlító módszerben.
remélem, hogy a hozzáférés-ellenőrzési szabályok sokkal világosabbak most. Arra biztatlak, hogy piszkosítsd be a kezed a kóddal, ha még nem tetted volna meg. Az elmélet hajlamos feledésbe merülni, ha nincs bizonyítva.
végül, ahogy ígértem-válaszok az állításokra:
- igaz
- igaz
- hamis
- hamis
- igaz
összefoglaló
azért írtam ezt a cikket, mert számomra az is meglepő volt, hogy a nyilvános, magán és védett hozzáférés valóban működik a Ruby-ban. A legegyszerűbb dolgokat a legnehezebb megérteni, vagy legalábbis lehet. Nagyon remélem, hogy ez a cikk hasznos volt az Ön számára. Vagy talán tisztában volt a hozzáférési szabályokkal, mielőtt elolvasta volna. Ossza meg gondolatait a megjegyzésekben, nagyon kíváncsi vagyok rájuk. Megnézheti a dokumentumokat is. Meg fogja találni ezeket a részleteket ott 🙂