Self in Klassenprozeduren

Bei der Programmierung mit Delphi verwende ich sehr oft Klassenprozeduren, um die Funktionalität einer konkreten Klasse aufzurufen. Innerhalb dieser Klassenprozedur wird eine Instanz der Klasse erzeugt, die benötigte(n) Methode(n) aufgerufen und die Instanz danach wieder freigegeben.

Das hat den Vorteil, dass ich von außen nur eben diese eine Klassenmethode aufrufen muss, ohne mich um das Erzeugen der Instanz und spätere wieder Freigeben kümmern zu müssen. Auch interessieren mich die Interna der Klasse außen nicht wirklich. Die Vorgehensweise passt sicherlich nicht überall, aber da wo sie passt, erspart sie mir Schreibarbeit.

Nun kommt es vor, dass genau so eine Klasse in einem abweichenden Kontext ein etwas anderes Verhalten aufweisen muss. Im Normalfall erstelle ich in solch einem Fall eine gemeinsame Basisklasse, die die Funktionalität implementiert, die in beiden Klassen gleich ist. Von dieser leite ich meine beiden konkreten Klassen ab. Da ich Informatiker bin und diese Spezies von Haus aus faul ist, möchte ich keinen Code doppelt schreiben und später pflegen müssen. So auch auch nicht meine oben angesprochene Klassenprozedur.

Doch wie erzeuge ich in der Klassenprozedur, die sich in meiner Basisklasse befindet eine Instanz von der jeweiligen konkreten Klasse? Die Lösung lautet Self. Self referenziert in einer Klassenprozedur die konkrete Klasse. Egal, ob die Klassenprozedur nun in einer meiner konkreten oder in der Basisklasse implementiert wurde. Das ganze sieht dann in etwa so aus:

Von dieser Basisklasse leite ich meine beiden koknreten Klassen TKonkreteKlasseA und TKonkreteKlasseB ab und überschreibe dort die protected Methode MeineFunktion um die abweichende Funktionalität zu implementieren.

Wenn ich nun von außen TKonkreteKlasseA.FuehreFunktionAus aufrufe, zeigt Self auf TKonkreteKlasseA und entsprechend beim Aufruf von TKonkreteKlasseB.FuehreFunktionAus auf TKonkreteKlasseB.

Für alle Intressierten habe ich das ganze in ein kleines Beispielprojekt gegossen: selfinklassenprozeduren.zip

Self in Klassenprozeduren
Markiert in:

2 Gedanken zu „Self in Klassenprozeduren

  • 13. April, 2009 um 10:49
    Permalink

    Um es kurz zu sagen: Self steht innerhalb einer Methode für den Namen des Objektes.

    • 13. April, 2009 um 11:19
      Permalink

      Jein. Wenn du Self in einem Objekt aufrufst, zeigt es auf die aktuelle Instanz der Klasse. Wenn du aber keine Instanz hast, wie das im Falle von Klassenprozeduren (class procedure) ist, verweist Self auf die Klasse selber.

Kommentare sind geschlossen.