10.5 Partielle Methoden
Partielle Klassen kennen Sie bereits, ich habe in Kapitel 3 darüber geschrieben. Noch einmal zur Erinnerung: Eine Klasse kann mit dem Schlüsselwort partial auf zwei oder mehr Quellcode-Dateien verteilt werden. Zur Kompilierzeit wird die auf mehrere Quellcodedateien verteilte Klasse so behandelt, als würde sie in einer Quellcodedatei vorliegen.
Es gibt neben den partiellen Klassen aber auch partielle Methoden. Partielle Methoden stellen eine Option dar, die wahrgenommen werden kann, aber nicht muss. Das erinnert uns ein wenig an Ereignisse, auf deren Auslösung wir mit einem Ereignishandler reagieren können oder auch nicht. Tatsächlich sind sich Ereignisse und partielle Methoden sehr ähnlich. Doch ehe wir uns das im Detail ansehen, lassen Sie uns zuerst über die Bedingungen sprechen, die beim Einsatz partieller Methoden beachtet werden müssen:
- Partielle Methoden setzen eine partielle Klassendefinition voraus.
- Der Rückgabetyp einer partiellen Methode ist grundsätzlich void.
- Partielle Methoden dürfen keine out-Parameter haben.
- Eine partielle Methode darf weder einen Zugriffsmodifizierer noch virtual, abstract, override, new und sealed aufweisen.
Nun wollen wir uns auch eine einfache Klasse ansehen, in der zwei partielle Methoden definiert sind.
// Beispiel: ..\Kapitel 10\PartielleMethoden
public partial class Person {
// Felder
private string _Name { get; set; }
public int Alter { get; set; }
// Partielle Methoden
partial void ChangingName(string name);
partial void ChangedName();
// Eigenschaft
public string Name {
get { return _Name; }
set {
ChangingName(_Name);
_Name = value;
ChangedName();
}
}
}
Listing 10.13 Das Beispielprogramm »PartielleMethoden«
Die partiellen Methoden ChangingName und ChangedName werden aufgerufen, bevor beziehungsweise nachdem sich der Wert der Eigenschaft Name geändert hat. Erfährt diese Klasse keine Erweiterung durch eine partielle Definition, wird der Compiler die partiellen Methoden nicht kompilieren und die Aufrufe der partiellen Methoden ignorieren.
Möglicherweise sind wir aber an einer Reaktion im Zusammenhang mit der Namensänderung interessiert. Vielleicht möchten wir diese sogar protokollieren oder uns ganz einfach nur die Änderung anzeigen lassen. Das ist ganz einfach zu realisieren, indem wir in der Klasse Person das Angebot der partiellen Methoden nutzen und diesen Code schreiben.
public partial class Person {
partial void ChangingName(string name) {
Console.WriteLine("Der alte Name '{0}' wird geändert.", name);
}
partial void ChangedName() {
Console.WriteLine("Name erfolgreich geändert.");
}
}
Listing 10.14 Die partiellen Methoden des Beispielprogramms
Zum Testen der Klasse Person genügt uns ganz einfacher Programmcode:
static void Main(string[] args){
Person pers = new Person { Name = "Fischer", Alter = 67 };
pers.Name = "Müller";
Console.WriteLine(pers.Name);
Console.ReadLine();
}
Listing 10.15 Testen des Beispielprogramms
Die Ausgabe an der Konsole zeigt uns an, dass wir den Namen der Person verändert haben. Also nichts, was besonders aufregend wäre.
10.5.1 Wo partielle Methoden eingesetzt werden
Partielle Methoden sind dort anzutreffen, wo Assistenten (natürlich insbesondere die von Visual Studio) automatisch Code erzeugen. Nehmen wir beispielsweise an, ein Assistent würde die Klasse Person wie folgt erzeugen:
public class Person {
// Felder
private string _Name { get; set; }
public int Alter { get; set; }
// Eigenschaft
public string Name {
get { return _Name; }
set { _Name = value; }
}
}
Listing 10.16 Nichtpartielle Klasse »Person«
Beachten Sie, dass die Klasse Person im Listing 10.16 nicht partial ist und folgerichtig auch keine partielle Methoden anbieten kann. Sie können den Quellcode nach eigenem Ermessen anpassen oder verändern, beispielweise in der Eigenschaft Name wie folgt:
public string Name {
get { return _Name; }
set {
Console.WriteLine("Der alte Name '{0}' wird geändert.", _Name);
_Name = value;
Console.WriteLine("Name erfolgreich geändert.");
}
}
Listing 10.17 Benutzerdefinierte Anpassung der Eigenschaft »Name«
Dagegen ist grundsätzlich nichts einzuwenden. Jetzt kommt das große Aber: Viele Assistenten ermöglichen eine Aktualisierung der automatisch erzeugten Klassen. In unserem fiktiven Fall wäre davon die Klasse Person betroffen. Aktualisiert der Assistent jedoch die Klasse Person, sind die Änderungen, die wir in der Eigenschaft Name vorgenommen haben, verloren. Sie werden schlichtweg überschrieben.
Und genau in solchen Situationen spielen partielle Methoden ihre Stärke aus. Hinterlegen Sie den zusätzlichen, benutzerdefinierten Programmcode nämlich in partiellen Methoden (wie im Beispiel PartielleMethoden gezeigt), werden die Codeergänzungen nicht überschrieben: Sie bleiben erhalten. Darüber hinaus ist auch weiterhin gewährleistet, dass die partiellen Methoden aufgerufen werden – zumindest solange der Assistent partielle Methoden bereitstellt. Aber das ist in der Regel der Fall.
Weiter hinten im Buch, wenn wir uns mit dem ADO.NET Entity Framework beschäftigen, werden Ihnen partielle Methoden wieder über den Weg laufen.
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.