Rubin programozás, 3. rész

A módszer olyan függvény, amely leírja egy objektum válaszát egy bejövő kérelemre. Vessen egy pillantást az alábbi példa módszerre:

A példa azt mutatja, hogy egy karaktersorozat számára egy úgynevezett hosszúságú metódust nevezünk.

Ebből a példából világos, hogy a döntés, hogy melyik módszerre hívják meg a futást, és hogy ez a választás a változó tartalmától függ. (az első esetben a foo változó sztring változó, a második - tömbként).

Az olvasónak lehet egy kérdése: "Hogy van, mivel a húr hosszát és a tömb hosszát másképpen kezelik?". Ne aggódjon. Szerencsére Ruby automatikusan kiválasztja a megfelelő módszert a helyzetre. Ezt a tulajdonságot az objektum-orientált programozásban polimorfizmusnak nevezik.

Nem szükséges tudni, hogyan működik ez a módszer, de mindenki tudnia kell, hogy milyen módszerek állnak rendelkezésre az objektum számára. Ha ismeretlen módszert hívnak le, hiba lép fel. Például próbálja meg a "hoo" metódust a "foo" objektumra, és hozzárendeli az "5" értékhez.

Már említettem egy speciális pszeudo-változó énet. Meghatározza azt a tárgyat, amelynek metódusát hívták. A változó jelzését azonban gyakran elhagyják, például:

lehet csökkenteni

Ez a két hívás megegyezik egymással, csak a második út az első egy rövidített változata.

A valós világ olyan objektumokból áll, amelyek osztályozhatók. Például egy egyéves kisbaba, aki egy kutyát lát, úgy gondolja, hogy ez egy "hóbort". Az objektumorientált programozás szempontjából a "hav-gav" egy osztály. és az osztályhoz tartozó objektum az osztály egy példánya.

A Ruby, valamint más objektum-orientált programozási nyelvek, először meg egy osztály viselkedésének leírására az objektumot, majd létrehoz egy példányt az osztály - egy külön egység. Most határozzuk meg az osztályt.

Az osztály-deklarációnak meg kell kezdenie a kulcsszóosztályt, és véget kell vetnie a kulcsszóvégzettel. Ebben az összefüggésben a def kulcsszó megkezdi az osztálymódszer definícióját.

Tehát egy "Dog 'nevű osztályt írunk le, és most létrehozunk egy objektumot.

Ez a kód egy új példányt hoz létre a Dog osztályból és társítja a tommy változóval. Minden osztály új módszere új osztályt hoz létre ebben az osztályban. Most a tommy változó rendelkezik a Dog osztály tulajdonságaival, és "bug" (a kéreg módszer).

öröklés

Elgondolkodott már arról, hogy a különböző emberek osztályozzák az objektumokat? Például, hogyan látják az emberek egy kutyát? A matematikus leírhatja a kutyát számok és geometriai alakok kombinációjaként. A fizikus a természetes és mesterséges erők munkájának eredménye. A húgom (biológus) a kutyát mint kutyaház (kutya házias) egy csoportját képviseli. A kutya egy kutyafaj, a kutya emlősfaj, és az emlősök mindig állatok.

Ebből nyilvánvaló, hogy az objektumok osztályozása hierarchiában van, bár nem mindig. Lássuk, hogyan lehet ezt Ruby-ban megvalósítani.

Ismeretes, hogy a szülő osztály tulajdonságait nem mindig öröklik a leszármazottak. Például a pingvinek nem tudnak repülni, bár madarak. Azonban a pingvinek számos más, a madarakban rejlő sajátosságot hordoznak, például tojást raknak. Hasonló esetek is megvalósíthatók Ruby-ban, de az olvasóknak lehetőséget adok arra, hogy ezt magam kezeljem.

Amikor új osztályt hoz létre, amely örökli a szülőosztály jellemzőit, csak olyan módszereket kell megadnunk, amelyek leírják a leszármazottak és a szülő közötti különbségeket. Ez az objektum-orientált programozás egyik előnye, amit néha "differenciálmű programozásnak" neveznek.

Felülvizsgálati módszerek

Már láttuk a különbségeket a gyermekosztályok viselkedésében, miután felülbírálta a szülő osztály módszereit. Nézze meg az alábbi példát:

A gyermekosztályban, amely felülbírálja a szülőosztály módját, az eredeti szülőmódot a szuper kulcsszóval hívhatja. Próbálja meg futtatni ezt a kódot:

Remélem, ezek az egyszerű példák elegendőek ahhoz, hogy megértsék az öröklés elvét és a módszerek újradefiniálását.

Bővebben a módszerekről

A módszer hívásának lehetősége korlátozott lehet. A felső szinten definiált függvényhez lásd alább:

Ha a függvénydefiníció kívül esik az osztálydefiníción, akkor az objektumosztály metódusaként kerül hozzáadásra. Az Object osztály az összes többi osztály alapkategóriája - Ruby-ban minden osztály az Object osztály leszármazottja. Így az sqr 'módszer hívható más osztályokból.

Most, hogy bármelyik osztály fel tudja hívni az sqr metódust, próbáljuk megnevezni azt az ál-változó önmagával:

Amint a fentiek szerint látható, egy függvény önmagával való hívása hibaüzenetet eredményez. Ez az üzenet nem elég egyértelmű (intuitív módon), mit jelent ez?

Az alsó sorban az, hogy bármelyik osztályon kívül meghatározott funkciókat egyszerű funkciónak kell nevezni, és nem mint módszereket. Tekintse meg, hogy milyen hibaüzenet jelenik meg, ha nem definiált egy módszert.

Az egyszerű funkcióként definiált módszereket egyszerű funkciónak kell nevezni, hasonlóan a C ++ függvényekhez, akár egy osztályon belül is.

FIELD eljárás láthatósága korlátozott lehet a kulcsszó „nyilvános” és a „magán”, ahol a lakosság - Public osztály határozza módszerek és magán - rejtett, amelyek úgynevezett csak más osztályba módszerekkel.

Ebből a példából minden világosnak kell lennie.

Singleton módszerek

Például viselkedése határozza meg a tartozás egy adott osztály, de néha szükség van, hogy ruházza egy bizonyos objektum, sajátos csak neki személyiség. A legtöbb programozási nyelv esetében külön osztályt kell létrehoznia ehhez. A Ruby lehetővé teszi, hogy egy adott módszert adj hozzá egy adott példányhoz (objektumhoz) szükségtelen gesztusok nélkül.

Abban az esetben, ha t1 és t2 ugyanazon osztályba tartoznak, és mégis, például t2, a metódusméretet "újradefiniálják, biztosítva az egyéniségét. Az ilyen speciális módszert Singleton módszernek nevezik.

Egyetlen módszer alkalmazásának egyik példájaként a program ablakában található gombokat egy grafikus felület segítségével hozhatja el, ahol minden egyes gombnak a műveleteket kattintással kell végrehajtania. Felülbírálhatjuk azt a módszert, amely kezeli az egyes rendelkezésre álló gombok megnyomását.

A Ruby-modulok nagyon hasonlítanak az osztályokra, de arra használják, hogy egy csoportba sorolják a kapcsolódó osztályokat. Az osztályokból származó modulok között három fő különbség van:

  1. A modulok nem rendelkeznek modul példákkal.
  2. A modulok nem rendelkezhetnek gyermekmodulokkal.
  3. A modulokat a modul határozza meg. végén.

Összességében két fő oka van a modulok használatának. Az egyik az, hogy módszereket és állandókat gyűjtsünk össze egy helyen. Például:

Az üzemeltető. 'azt jelzi, hogy az állandó a megfelelő modulban vagy osztályban van megadva. A módszerek vagy állandók közvetlen eléréséhez használja az "

A másik ok a "mixin" modulok. Ennek a kifejezésnek a jelentése meglehetősen bonyolult a megértéshez, ezért inkább részletesen foglalkozzunk vele.

Néhány objektumorientált nyelv lehetővé teszi több szülőosztály örökségét, ezt a lehetőséget több örökségnek nevezik. Ruby-t szándékosan megfosztották ettől a lehetőségtől. Ehelyett lehetővé teszi a modullal való keverést.

Mint már említettük, a modul nagyon hasonlít egy osztályra. A modulokban alkalmazott módszerek vagy konstansok nem öröklődhetnek, de hozzáadhatók más modulokhoz vagy osztályokhoz az irányelv tartalmazhat. Így a modul összekapcsolása a definícióval a modul tulajdonságait hozzáadja (keverékek) az osztály vagy modul tulajdonságaihoz.

Keverés modulok látható a standard könyvtár, amelynek eredményeként a „keveredés” modulok egy osztály, amely módszerek mindegyike „visszatér minden eleme, az utóbbi rendelkezésére áll módszerek egyfajta” találni”, stb ..

A többszörös öröklés és a "keverés" között a következő különbségek vannak:

  • A modulnak nem lehet modulpéldánya, csak absztrakt osztályok rendelkeznek ezzel a funkcióval.
  • A modul tárolja az esetek kapcsolatát egy fa formájában.

Ezek a különbségek megtiltják az osztályok közötti összetett kapcsolatokat, az egyszerűség az ügy középpontjában áll. Emiatt a Ruby nem támogatja a többszörös öröklést. A többszörös öröklést támogató nyelvek esetében előfordulhat, hogy az osztályok több őrt tartalmaznak, és az osztályok példányai közötti kapcsolatok bonyolult hálózatot hoznak létre. A helyzet túl bonyolult az emberi agy számára, legalábbis az enyém.

Másrészről, az összetévesztés mindezt képviseli, egyszerűen "minden hozzáadott tulajdonság egyedi tulajdonságainak gyűjteménye".

Még a többszörös öröklésű nyelvek esetében is úgy vélik, jobb, ha az osztályokat zavarodottsággal bővítik, és nem komplex öröklési viszonyokat fejlesztenek ki. Rubyban ez az elgondolás tovább fejlődött, és helyettesíti a többszörös öröklés fogalmát.

Eljárási tárgyak

Képzeld el, hogy olyan programot írsz, amely néhány jelet feldolgoz. Ennek ismeretében meg fogják érteni az eljárás átvitelének egész varázsát a módszer feldolgozásával (amely a jelfeldolgozással foglalkozik).

Eljárási objektumokat hoz létre a beépített proc módszerrel. A végrehajtható kód gömbölyű zárójelben van feltüntetve. A végrehajtási hívást procedurális objektum hívásával végezzük. Lásd alább:

A C-programozók hasonlóságot mutatnak az eljárási objektumok és a funkciómutatók között.

következtetés

Ez a rész a sorozatban a végső. A sorozat célja az volt, hogy a Ruby nyelvére vonatkozó kezdeti információkat adja meg. Mostanra túl elfoglalt vagyok az okleveles projektemben, hogy időt adjunk a Ruby mélyebb tanulmányozására. De a jövőben, amint az idő lehetővé teszi, folytatni fogom.

Hiran Ramankutty

A Trichur-i Kormányzati Kollégium utolsó évének diákja vagyok. A Linux mellett nagyon örülök a fizika tanulmányozásának.