Másolás a vágólapra

TwitterFacebook

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:

  1. 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.
  2. mind a védett, mind a privát metódusok nem hívhatók meg a meghatározó osztály kívülről.
  3. a Védett módszerek az alosztályból érhetők el, a privát módszerek pedig nem.
  4. a meghatározó osztály privát metódusai az adott osztály bármely példányával meghívhatók.
  5. 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 CityCity é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: wroclawsan_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 greetingelé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át population_density belül.
  • the_same_continent?(other_region) – védett continent belül.
  • can_be_crowdy? – privát consider_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_methodkell 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:

  1. igaz
  2. igaz
  3. hamis
  4. hamis
  5. 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 🙂

csatlakozás

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.