<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Methodenzeiger</id>
	<title>Methodenzeiger - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Methodenzeiger"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Methodenzeiger&amp;action=history"/>
	<updated>2026-05-25T22:51:47Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Wikipedia (Deutsch) – Lokale Kopie</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki-de.moshellshocker.dns64.de/index.php?title=Methodenzeiger&amp;diff=438889&amp;oldid=prev</id>
		<title>imported&gt;Nachtbold: Die letzte Textänderung von 84.46.93.228 wurde verworfen und die Version 192185781 von Diaspomod wiederhergestellt.</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Methodenzeiger&amp;diff=438889&amp;oldid=prev"/>
		<updated>2021-04-16T10:36:21Z</updated>

		<summary type="html">&lt;p&gt;Die letzte Textänderung von &lt;a href=&quot;/index.php/Spezial:Beitr%C3%A4ge/84.46.93.228&quot; title=&quot;Spezial:Beiträge/84.46.93.228&quot;&gt;84.46.93.228&lt;/a&gt; wurde verworfen und die Version &lt;a href=&quot;/index.php/Spezial:Permanenter_Link/192185781&quot; title=&quot;Spezial:Permanenter Link/192185781&quot;&gt;192185781&lt;/a&gt; von Diaspomod wiederhergestellt.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Ein &amp;#039;&amp;#039;&amp;#039;Methodenzeiger&amp;#039;&amp;#039;&amp;#039; wird bei [[Objektorientierte Programmierung|objektorientierter Programmierung]] verwendet, um auf eine [[Methode (objektorientierte Programmierung)|Methode]] einer [[Klasse (objektorientierte Programmierung)|Klasse]] oder einer [[Objekt (Programmierung)|Objektinstanz]] zu verweisen. Er ähnelt einem Funktionszeiger (einem [[Zeiger (Informatik)|Zeiger]] auf eine [[Funktion (Programmierung)|Funktion]]). In manchen Programmiersprachen ist es üblich, einen Methodenzeiger als &amp;#039;&amp;#039;Methode&amp;#039;&amp;#039; oder &amp;#039;&amp;#039;[[Referenz (Programmierung)|Referenz]] auf eine Methode&amp;#039;&amp;#039; zu bezeichnen. Es wird zwischen gebundenen und ungebundenen Methodenzeigern unterschieden, je nachdem wann der &amp;#039;&amp;#039;self&amp;#039;&amp;#039;- oder &amp;#039;&amp;#039;this&amp;#039;&amp;#039;-Parameter bestimmt wird.&lt;br /&gt;
&lt;br /&gt;
== Gebundene Methodenzeiger ==&lt;br /&gt;
&lt;br /&gt;
Bei gebundenen Methoden (&amp;#039;&amp;#039;bound method&amp;#039;&amp;#039; in [[Python (Programmiersprache)|Python]]) enthält der Methodenzeiger einen [[Zeiger (Informatik)|Zeiger]] auf eine Methode und einen Zeiger auf eine Objektinstanz. Solche Methodenzeiger lassen sich als [[Rückruffunktion]] &amp;#039;&amp;#039;(callback function)&amp;#039;&amp;#039; nutzen, um Aktionen bei [[Ereignis (Programmierung)|Ereignissen]] (engl.: Events) auszulösen.&lt;br /&gt;
&lt;br /&gt;
== Ungebundene Methodenzeiger ==&lt;br /&gt;
&lt;br /&gt;
Bei ungebundenen (auch: freien) Methoden (&amp;#039;&amp;#039;unbound method&amp;#039;&amp;#039; in Python, &amp;#039;&amp;#039;Method&amp;#039;&amp;#039; in [[Java (Programmiersprache)|Java]]) enthält der Methodenzeiger einen Verweis auf eine Methode, aber &amp;#039;&amp;#039;keinen&amp;#039;&amp;#039; Verweis auf eine Objektinstanz. Einem ungebundenen Methodenzeiger muss beim Aufruf eine passende Objektinstanz übergeben werden.&lt;br /&gt;
&lt;br /&gt;
In [[C++]] existieren ebenfalls ungebundene Methodenzeiger. Diese zeigen auf eine Methode einer Klasse und werden beim Aufruf an ein Objekt gebunden. Hierfür existieren die Operatoren &amp;lt;code&amp;gt;.*&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;-&amp;gt;*&amp;lt;/code&amp;gt;. Intern ist ein Methodenzeiger eine Nummer, welche einen Eintrag in der Methodentabelle der Klasse referenziert.&lt;br /&gt;
&lt;br /&gt;
Auch [[Objective-C]] bietet ungebundene Methodenzeiger des Typs &amp;lt;code&amp;gt;IMP&amp;lt;/code&amp;gt;. Wegen ihrer fehlenden Objektorientierung werden sie allerdings nur selten zur Verbesserung des Laufzeitverhaltens eingesetzt. Ansonsten wird das überlegene Konzept der Selektoren verwendet.&lt;br /&gt;
&lt;br /&gt;
=== Beispiel in C++ ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
class Auto {&lt;br /&gt;
public:&lt;br /&gt;
    // 4 &amp;quot;member functions&amp;quot; = &amp;quot;Methoden&amp;quot;&lt;br /&gt;
    void starten() {&lt;br /&gt;
        std::cout &amp;lt;&amp;lt; &amp;quot;Starten...&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    void beschleunigen(double beschleunigung);&lt;br /&gt;
    void bremsen(double verzoegerung);&lt;br /&gt;
    void ausschalten();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    Auto a;&lt;br /&gt;
&lt;br /&gt;
    // erzeuge method_ptr und initialisiere ihn mit Auto::starten&lt;br /&gt;
    void (Auto::*method_ptr)() = &amp;amp;Auto::starten;&lt;br /&gt;
&lt;br /&gt;
    // rufe Methode, auf die method_ptr zeigt. in dem Falle: a.starten()&lt;br /&gt;
    (a.*method_ptr)();&lt;br /&gt;
&lt;br /&gt;
    // FEHLER: Falscher Methodentyp, da Auto::beschleunigen einen Parameter&lt;br /&gt;
    // erwartet&lt;br /&gt;
    method_ptr = &amp;amp;Auto::beschleunigen;&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Verwandte Konzepte ==&lt;br /&gt;
&lt;br /&gt;
=== Delegates ===&lt;br /&gt;
&lt;br /&gt;
In .NET-Sprachen wie [[C-Sharp|C#]], [[VB.NET]] oder [[D (Programmiersprache)|D]] werden &amp;#039;&amp;#039;[[Delegation (Softwareentwicklung)|Delegate]]&amp;#039;&amp;#039;-Variablen für die Erstellung typsicherer Methodenzeiger verwendet. Zusätzlich unterstützen .NET-Delegates weitere Operationen.&lt;br /&gt;
&lt;br /&gt;
=== Delegates in spät bindenden Sprachen ===&lt;br /&gt;
&lt;br /&gt;
In spät bindenden Sprachen wie Objective-C ist zwischen der Nachricht („Methodenaufruf“) und der Methode zu unterscheiden. Der Compiler übersetzt eine Methode und deren Aufruf nicht in einen Index für eine &amp;#039;&amp;#039;vtab&amp;#039;&amp;#039;. Vielmehr bleibt die Nachricht unverändert bestehen. Die Liste der Methoden eines Objektes ist ein assoziatives Array, enthält also einen Verweis von Nachrichtenname auf Methode. Daher ist es möglich, erst zur Laufzeit anhand der Nachrichten zu entscheiden, welche Methode ausgeführt werden soll. Als Folge davon ist es nicht notwendig, die Klasse des Empfängers zu kennen oder dass die Methode bereits in einer bekannten Superklasse wenigstens abstrakt definiert ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
// Instanz beliebiger (unbekannter) Klasse&lt;br /&gt;
id myDelegate;&lt;br /&gt;
// Nachrichtenname&lt;br /&gt;
SEL messageSelector = @selector(sender:doSomethingWithObject:);&lt;br /&gt;
&lt;br /&gt;
if ([myDelegate respondsToSelector:messageSelector]) {&lt;br /&gt;
    [myDelegate sender:self doSomethingWithObject:anObject];&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es ist zu beachten, dass durch die Verwendung von id jede Instanz jeder beliebigen Klasse als Empfänger angenommen werden kann. Da Delegates nicht alle Methoden implementieren müssen, wird zur Laufzeit abgefragt, ob eine entsprechende Implementierung vorliegt. Delegating ist also ein Angebot, keine Pflicht. Es dient der Vermeidung von Ableitungen (White-Boxing) und Herstellung einer definierten API zur Funktionsspezialisierung. Implementierungsseitig lässt sich das Vorhandensein von Methodenimplementierung vortäuschen und auf diese Weise eine Nachricht weiterleiten (Forward-Invocation, Proxy).&lt;br /&gt;
&amp;lt;!-- Wahrscheinlich weitere Beispiele für Methodennamen: Perl &amp;quot;Symbolic References&amp;quot;? Smalltalk? Smalltalk verhält sich da wie Objective-C --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.parashift.com/c++-faq/pointers-to-members.html Pointers to member functions, C++ FAQ] (englisch) – 15 theoretisch und praktisch fundierte Artikel zu Methodenzeigern&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Objektorientierte Programmierung]]&lt;br /&gt;
[[Kategorie:Programmiersprachelement]]&lt;br /&gt;
&lt;br /&gt;
[[en:Delegation (programming)]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Nachtbold</name></author>
	</entry>
</feed>