„Továbbítás (objektumorientált programozás)” változatai közötti eltérés

fogalmak egyeztetése, linkek javítása -> már meglévő cikkre mutasson
a (replaced: <source → <syntaxhighlight (6), </source> → </syntaxhighlight> (6) AWB)
(fogalmak egyeztetése, linkek javítása -> már meglévő cikkre mutasson)
 
Az [[objektumorientált programozás]]ban a '''továbbítás''' azt jelenti, hogy egy objektum egy tagjának (akár tulajdonságnak, akár egy módszernekmetódusának) a használata azt eredményezi, hogy egy másik objektum megfelelő tagját használjuk valójában: egy másik objektumnak átadjuk a használatot. Az átirányítást számos [[Programtervezési minta|tervezési mintában]] használják, ahol egyes tagokat egy másik objektumnak továbbítanak, míg másokat a közvetlenül használt objektum kezel. A továbbító objektumot gyakran ''wrappercsomagoló objektum''nak nevezik, az explicit továbbító tagokat pedig ''wrappercsomagoló funkció''nak.
 
== Delegálás ==
A továbbítást gyakran összekeverik a delegálással; formálisan ezek kiegészítő fogalmak. Mindkét esetben két objektum létezik, és az első (küldő, csomagoló) objektum a második (fogadó, csomagolandó) objektumot használja, például egy metódus meghívására. Különböznek abban, hogy mi utal önmagára a fogadó objektumra (formálisan a metódus kiértékelési környezetében a fogadó objektumra): átruházáskor a küldő objektumra, míg továbbításkor a fogadó obejktumra utal. Vegyük figyelembe, hogy a "self" kulcsszó gyakran implicit módon van használva a dinamikus továbbítás részeként (módszermetódus felbontása: melyik funkcióra utal a módszermetódus neve).
 
{{quote|A továbbítás és a delegálás közötti különbség a saját paraméterek összekötésében van, amikor a csomagolandót a csomagolón keresztül hívják meg. Delegálással a saját paraméter a csomagolóhoz van kötve, továbbításnál pedig a csomagolandóhoz. A továbbítás az automatikus üzenetküldés egy formája; a delegálás az öröklés egy formája, amelyben a szülő (szuperosztályősosztály) összekötése futási időben történik, nem pedig az összeállítási/összekapcsolási időben, mint a „normál” öröklésnél.<ref name="buechiweck">{{cite book |first1=Martin |last1=Büchi |first2=Wolfgang |last2=Weck |title=ECOOP 2000 — Object-Oriented Programming
|chapter=Generic Wrappers |chapter-url=http://www.lirmm.fr/~ducour/Doc-objets/ECOOP/papers/1850/18500201.pdf |volume=1850 |series=Lecture Notes in Computer Science |year=2000 |doi=10.1007/3-540-45102-1_10 |pages=[https://books.google.com/books?id=CFtuCQAAQBAJ&pg=PA212&dq=forwarding+vs.+delegation 212–213]|isbn=978-3-540-67660-7 }}</ref>
}}
delegáláskor ez m2 és n1 kimenetet eredményez, mivel az <code>n()</code>értékét az eredeti (küldõ) objektummal összefüggésben értékeli ki, míg a továbbítás alatt ez m2, n2 kimenetet eredményez mert <code>n()</code> a fogadó objektummal összefüggésben van kiértékelve.<ref name="buechiweck" />
 
Általános használat esetén a továbbítást gyakran "delegálásnak" nevezik, vagy átruházásnak tekintik, ám gondos használat esetén egyértelműen megkülönböztető, hogy a "self" mire utal. Míg a delegálás hasonlít az örökléshez, lehetővé téve a működésen alapuló újrafelhasználást (és konkrétan a kód újrafelhasználását) anélkül, hogy megváltoztatná a környezetét. A továbbítás hasonló a kompozícióvalkompozícióhoz, mivel a végrehajtás csak a fogadó objektumtól függ, és nem az (eredeti) küldõ objektumtól. Mindkét esetben az újrafelhasználás dinamikus, vagyis futási időben meghatározott (az objektum alapján, amelyre a felhasználást átruházják vagy továbbítja), nem pedig statikus, azaz a fordítási időben meghatározott (az az osztály alapján, amelytől örökölt). Az örökléshez hasonlóan a delegálás lehetővé teszi a küldő objektum számára az eredeti viselkedés módosítását, de érzékeny a alaposztályhoz hasonló problémákra. A továbbítás erősebb beágyazást biztosít és elkerüli ezeket a problémákat, lásd az objektum-összetételt az öröklés felett.<ref name="buechiweck" />
 
== Példák ==
=== Komplex ===
 
A bonyolultabb eset a [[Díszítő programtervezési minta|díszítő minta]], amely interfészek használatával rugalmasabbá és típusbiztonságosabbá teszi a továbbítást. A "rugalmasság" itt azt jelenti, hogy a C-nek semmilyen módon nem kell utalnia A-ra vagy B-re, mivel a továbbítás váltása C-ből származik. Ebben a példában a C osztály továbbíthat minden osztályhoz, amely implementálja az I interfészt. A C osztály rendelkezik egy metódussal, hogy tudjon váltani a továbbítók között. Az implements kulcsszó javítva a típusbiztonságot, mivel minden osztálynak implementálnia kell a metódusokat amelyeket az interfész tartalmaz. A fő kompromisszum az több kódot jelent.
 
<syntaxhighlight lang="Java">
A továbbítást számos tervezési mintában használják.<ref>{{cite book |last=Gamma |first=Erich |authorlink=Erich Gamma |title=Design Patterns: Elements of Reusable Object-Oriented Software |year=1995 |publisher=[[Addison-Wesley]] |isbn=978-0-201-63361-0 |authorlink3=Ralph Johnson (computer scientist) |authorlink2=Richard Helm |first2=Richard |last2=Helm |authorlink4=John Vlissides |first3=Ralph |last3=Johnson |first4=John |last4=Vlissides |title-link=Design Patterns (book) |bibcode=1995dper.book.....G}}</ref> A továbbítást közvetlenül több mintában használják:
 
* [[Felelősséglánc programtervezési minta|Felelősséglánc minta]]
* Chain-of-responsibility pattern
* Decorator[[Díszítő patternprogramtervezési minta|Díszítő/dekorátr minta]]: A díszítő objektum hozzáadja saját tagjait, majd továbbadja a díszített tárgyat.
* [[Helyettes programtervezési minta|Helyettesítő/proxy minta]]
* Proxy pattern
 
A továbbítás más mintákban is felhasználható, de a felhasználás gyakran módosul, például egy metódushívás egy objektumra több különféle metódus hívását eredményezi egy másikon:
 
* [[Illesztő programtervezési minta|Illesztő/Adapter minta]]
* Adapter pattern
* [[Híd programtervezési minta| Híd minta]]
* Bridge pattern
* [[Homlokzat programtervezési minta|Homlokzat/Facade minta]]
* Facade pattern
 
== Források ==