„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ó |
a replaced: <source → <syntaxhighlight (6), </source> → </syntaxhighlight> (6) AWB |
||
9. sor:
Például, adott a következő kód:
<
// Sender
void n() {
23. sor:
print("n2");
}
</syntaxhighlight>
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:
<
class B {
A a;
T foo() { return a.foo(); }
}
</syntaxhighlight>
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:
<
class A {
T foo() { /* ... */ };
47. sor:
class B extends A {
}
</syntaxhighlight>
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).
<
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>
=== 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:
<
class RealPrinter { // the "receiver"
void print() {
113. sor:
}
}
</syntaxhighlight>
=== 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.
<
interface I {
void f();
157. sor:
}
}
</syntaxhighlight>
== Alkalmazások ==
|