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

[ellenőrzött változat][ellenőrzött változat]
Tartalom törölve Tartalom hozzáadva
aNincs szerkesztési összefoglaló
B.Zsoltbot (vitalap | szerkesztései)
a replaced: <source → <syntaxhighlight (6), </source> → </syntaxhighlight> (6) AWB
9. sor:
 
Például, adott a következő kód:
<sourcesyntaxhighlight lang="Java">
// Sender
void n() {
23. sor:
print("n2");
}
</syntaxhighlight>
</source>
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" />
 
31. sor:
Az explicit továbbítás egyszerű példája Java-ban: a <code>B</code>példány továbbítja a hívásokat a <code>foo</code> metódus <code>a</code> mezőjének:
 
<sourcesyntaxhighlight lang="Java">
class B {
A a;
T foo() { return a.foo(); }
}
</syntaxhighlight>
</source>
Vegyük figyelembe, hogy az <code>a.foo()</code> végrehajtásakor a <code>this</code> objektum egy <code>a</code> (<code>A altípusa</code>), nem pedig az eredeti objektum (<code>B példánya</code>). Ezenkívül <code>a</code> -nak nem feltétlenül kell az <code>A</code> példányának lennie: lehet egy altípus példánya is. Valójában, <code>A</code> -nak nem is kell osztálynak lennie: lehet interfész.
 
Az örökléssel ellentétben, amelyben a <code>foo</code>értéket egy <code>A</code> szuperosztályban definiálják (amelynek osztálynak kell lennie, nem interfésznek), és amikor<code>B</code>, alosztály példányára hívják, akkor az <code>A</code>-ban definiált kódot használja, de ez az objektum még mindig <code>B</code> példánya:
<sourcesyntaxhighlight lang="Java">
class A {
T foo() { /* ... */ };
47. sor:
class B extends A {
}
</syntaxhighlight>
</source>
 
Ebben a Python-példában a <code>B</code> osztály továbbítja a <code>foo metódust</code>és az <code>x</code> property-t az <code>a</code> mezőben lévő objektumnak: ezek használata <code>b-n</code> (<code>B példánya</code>) ugyanaz, mint a <code>b.a</code> használata (<code>A</code> példánya, amelyhez ezek vannak továbbítva).
 
<sourcesyntaxhighlight lang="python">
class A(object):
def __init__(self, x) -> None:
84. sor:
b.x = 17 # b.a.x now has value 17
del b.x # Deletes b.a.x.
</syntaxhighlight>
</source>
 
=== Szimpla ===
92. sor:
Az átirányítás egyszerűen valamilyen kötelességet ruház át valaki másra. Íme egy egyszerű példa:
 
<sourcesyntaxhighlight lang="java">
class RealPrinter { // the "receiver"
void print() {
113. sor:
}
}
</syntaxhighlight>
</source>
 
=== Komplex ===
119. sor:
A bonyolultabb eset a 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.
 
<sourcesyntaxhighlight lang="Java">
interface I {
void f();
157. sor:
}
}
</syntaxhighlight>
</source>
 
== Alkalmazások ==