Klasse - ist ein benutzerdefinierter Datentyp (Referenztyp) - hat Datenelemente - hat Methoden - Konstruktor ist spezielle Methode zum Erstellen eines Objektes vom Typ der Klasse (Instanz) - jede Klasse ist von System.Object abgeleitet auch dann wenn dies nicht explizit angegeben wird - Syntax: [Attribute] [Zugriffsmodifikatoren] class Bezeichner [:Basisklasse] {Klassenrumpf} - Attribute: intrinsische (Bsp: [Serializable]) und benutzerdefinierte - Beispiel: [Serializable] public class B : A {} Prof. W. Henrich Seite 1
Elemente einer Klasse - Felder - Konstanten - Methoden - Konstruktoren - Destruktoren - Eigenschaften (Properties) später behandelt werden: - Operatoren - Ereignisse - Indexer Grundlagen Prof. W. Henrich Seite 2
Felder - Felddeklaration in der Klasse kann optional mit Vorgabewert versehen werden Bsp.: public int i =2; - Felder können als readonly deklariert werden. Diese können nach der Erstellung und Initialisierung nicht mehr verändert werden Die Wertzuweisung erfolgt bei der Deklaration oder im Konstruktor - statische Felder gehören zur Klasse, wobei Zugriff nur über die Klasse aber nicht über Instanz möglich ist - expliziter Initialisierer ist für statische Datenelemente erforderlich - Zugriff auf statische Elemente erfolgt über den Klassennamen mit. Operator (Bsp: A.fn();} Prof. W. Henrich Seite 3
Konstanten - werden mit dem Modifizierer const deklariert und ähneln einem Feld Bsp.: public const int size = 8; - der Wert muss in der Deklaration zugewiesen werden und kann nicht im Konstruktor zugewiesen werden - Wert muss zur Compilierzeit bekannt sein (Unterschied zu readonly Feldern) - verhalten sich wie static deklarierte Elemente, und können nicht als static deklariert werden - der Zugriff erfolgt über Klassennamen und ist nicht über eine Instanzvariable möglich (Bsp.: A.i nicht a.i) - Wert muss als Literal geschrieben werden Prof. W. Henrich Seite 4
Methoden - alle Methoden gehören zur Klasse es gibt keine globalen (freien) Funktionen - Deklaration und Definition erfolgt innerhalb der Klasse - Syntax: [Zugriffsebene] R-Typ Name Parameterliste Fktkörper Bsp.: public void fn(int i, char c) { } - der defaultmässige Zugriffsmodifizierer ist private - Methoden müssen nicht deklariert werden bevor sie benutzt werden (Unterschied zu C++) - haben Zugriff auf alle Elemente der Klasse - zu jedem Übergabeparametertyp muss ein Bezeichner angegeben werden Bsp.: void fn(int){...} // falsch - statische Methoden gehören zur Klasse und können nur über die Klasse aufgerufen werden Prof. W. Henrich Seite 5
Methodenparameter 1 - statische Methoden können keine nichtstatischen Elemente aufrufen - nicht statische Methoden können statische Elemente aufrufen - Methodenparameter können nicht (wie in C++) mit Defaultwerten versehen werden - Die Parameter werden standardmäßig als Wert übergeben - werden Objektverweise übergeben, so werden diese auch als Wert übergeben - Das Schlüsselwort params ermöglicht eine variable Parameterliste: static void fn(params int[] intlist)... Aufruf: fn(1,2,3); - params kann nicht mit ref und out (siehe unten) kombiniert werden Prof. W. Henrich Seite 6
Methodenparameter 2 - Schlüsselwort ref dient zur Übergabe eines Parameters als Verweis, der initialisiert sein muss Bsp. void fn (ref int i)... // i wird als Verweis //übergeben und kann geändert werden - ref muss sowohl in der Methodendefinition als auch beim Aufruf angegeben werden - ref auf Verweistyp macht Originalverweis änderbar - Schlüsselwort out gibt an, daß dieser Parameter beim Aufruf nicht übergeben wird da er ausschließlich für die Rückgabe verwendet werden soll - ein mit out modifizierter Parameter muss nicht initialisiert werden - einem mit out modifiziertem Parameter muss im Funktionskörper ein Wert zugewiesen werden Prof. W. Henrich Seite 7
Überladen von Methoden - Methoden können überladen werden, d. h. es kann mehrere Methoden mit gleichem Bezeichner geben, dies sind dann unterschiedliche Methoden - Überladen wird über verschiedene Parameterlisten aber nicht über Rückgabetyp bzw. Zugriffsmodifizierer ermöglicht - out und ref nicht gleichzeitig zum Überladen verwendbar - Beim Aufruf überladener Methoden werden implizite Konvertierungen durchgeführt - Falls beim Aufruf Auswahl nicht eindeutig -> Compilerfehlermeldung Prof. W. Henrich Seite 8
Konstruktoren 1 - Instanzkonstruktoren dienen dem Erstellen einer Instanz der Klasse - new ruft den Instanzkonstruktor auf Bsp.: class A{} A a = new A(); // a ist dann Referenz - werden immer aufgerufen beim Erstellen einer Instanz - können überladen werden - haben den gleichen Namen wie die Klasse und keinen Rückgabeparameter - Standardkonstruktor initialisiert mit Standardwerten (Bsp. int mit 0) - Aufruf Konstruktor von Konstruktor mit :this(parameter) Bsp.: A(int i, int j) : this(j){ } Prof. W. Henrich Seite 9
Konstruktoren 2 - Falls kein Konstruktor definiert wird ist der Standardkonstruktor (ohne Übergabeparameter) verfügbar - Falls mindestens ein Konstruktor definiert wird ist der Standardkonstruktor nicht mehr verfügbar - Erstellen von Kopien; siehe später (Clone, Kopierkonstruktor) - Syntax: [Zugriffsmodifikator] Klassenname ([Argumentliste]){Konstruktorkörper} - Statische Konstruktoren werden zur Bearbeitung statischer Elemente eingesetzt - Statische Konstruktoren werden automatisch aufgerufen Prof. W. Henrich Seite 10
Statischer Konstruktor - Zweck: Erledigung von Setup-Aufgaben, die nicht per Initialisierer erreicht werden können und nur einmal durchgeführt werden sollen - statischer Konstruktor initialisiert statische Elemente Instanz Konstruktor initialisiert Instanz Elemente - dürfen keinen Zugriffsmodifikator erhalten Aufrufreihenfolge statischer Konstruktoren - statische Konstruktor wird aufgerufen bevor erste Instanz erstellt wird - statische Konstruktor wird nur einmal aufgerufen - statische Konstruktor wird aufgerufen nachdem statische Elemente initialisiert wurden - statische Konstruktor wird aufgerufen bevor auf statische Member verwiesen wird Prof. W. Henrich Seite 11
Destruktoren - werden wie in C++ definiert ~Klassenname(){ } haben aber andere Bedeutung - werden vom Garbage Collector (GC) automatisch aufgerufen bevor dieser den Speicherplatz freigibt und nicht wenn Variable Gültigkeit verliert (GC wird später behandelt) - GC erfogt automatisch, so dass in der Regel kein Destruktor erforderlich ist - Objekte die Destruktoren enthalten benötigen mehr Zeit bei der Erstellung und Freigabe - Destruktor ist nur erforderlich für nicht automatisch handhabbare Ressourcen d. h. meistens nicht erforderlich Prof. W. Henrich Seite 12
Properties 1 - Eigenschaften sind speziellemethoden, die den Zugriff auf Datenelemente ermöglichen, wobei der Anschein des direkten Zugriffs auf ein Feld entsteht - tatsächlich erfolgt der Zugriff über Methoden Bsp.: int p=11; public int P{ get{return p; } set{p=value;)} Aufruf: Instanz.P = 7; - mindestens eine dieser Methoden (get oder set) muss implementiert werden - Vorteil: die Implementierung (z.b. Plausibilitätsprüfungen)des dahinter verborgenen Elementes könnte geändert werden, ohne dass der Zugreifer hiervon beeinflusst wird Prof. W. Henrich Seite 13
Properties 2 - aus Sicht des Clients ist es eine Membervariable - Definiton einer Eigenschaft entspricht Definition eines Datenelementes mit anschließendem Block für get und/oder set - get und set haben keine expliziten Parameter - set hat impliziten Parameter value - get/set werden vom Compiler inline expandiert - sie lassen sich nicht als Argumente an Methoden übergeben - sie können static sein - als Namenskonvention wird der Bezeichner für die Property gleich dem Bezeichner des Datenelementes mit grossem Anfangsbuchstaben (Datenelement klein) benannt Prof. W. Henrich Seite 14
Geschachtelte Klassen - Klassen bzw. Strukturen können selbst wieder solche enthalten - In der Regel sind dies lokal benötigte Hilfstypen - Sichtbarkeit des geschachtelten Typs kann auf enthaltenden Typ beschränkt werden - Bsp.: class A{...class B{...}...} - Eingeschachtelte Typen sehen alle Elemente des umliegenden Typs (auch private) - Zugriff auf äussere Instanzelemente erfolgt über Referenz auf aüssere Instanz - Äussere Typen sehen nur die public Elemente ihrer inneren Typen - Felder von inneren und äusseren Typen gehören zu unterschiedlichen Instanzen Prof. W. Henrich Seite 15