Eigenschaften

Statische und Nichtstatische Methoden Properties / Eigenschaften • Statische Methoden • Definition und Merkmale von Properties • Modifizierer • Beispi...
Author: Stefanie Gerber
3 downloads 2 Views 3MB Size
Statische und Nichtstatische Methoden Properties / Eigenschaften • Statische Methoden • Definition und Merkmale von Properties • Modifizierer • Beispiele • Nebeneffekte

Dr. Beatrice Amrhein

Statische / Nichtstatische Methoden/Felder in Klassen

2

Statische Methoden/Felder Mit dem static Modifizierer kann eine statische Methode (ein statisches Feld) deklariert werden, die zum Typ der Klasse und nicht zu einem bestimmten Objekt dieses Typs gehört. Statische Methoden kennen die Referenz des Objekts nicht und können darum die (nicht statischen) Felder der Klasse/des Objekts nicht benutzen. Der Zugriff auf statischen Felder geschieht über den Klassennamen und nicht über das Objekt Der Aufruf von statischen Methoden geschieht über den Klassennamen und nicht über das Objekt 3

Beispiel Die Klasse Circle hat einen statischen Zähler _CountCircles, Dieser wird im Konstruktor um 1 erhöht, das heisst, die Anzahl erzeugter Kreise wird in _CountCircles gezählt.

4

Beispiel Die Methode Area() ist eine Methode der Klasse und hat darum Zugriff auf die privaten Member-Variablen von Circle. Die Methode getNumber() ist statisch und hat darum nur Zugriff auf die statische Variable _CountCircles.

5

Beispiel Die Methode getInfo() ist statisch, darum zeigt der Zugriff auf XCoordinate und YCoordinate einen Fehler an. getInformation() ist nicht statisch, also ist der Zugriff möglich.

6

Statische Methoden Statische Methoden können aufgerufen werden, ohne dass eine Instanz der entsprechenden Klasse existiert. Statische Methoden eignen sich als Dienstmethoden, welche nicht vom Zustand eines Objektes abhängig sind. Statische Methoden können nur auf statische Methoden und statische oder konstante Felder zugreifen, da sie nicht zu einem Objekt gehören (keine Objekt-Referenz haben).

7

Verwendung von statischen und nichtstatischen Methoden “Normale” Klassen-Methoden werden mit Hilfe eines konkreten Objekts (hier c1 oder c2 ) aufgerufen. Statische Methoden werden mit dem Klassen-Namen aufgerufen.

normale Aufrufe mit Objekt

Aufruf der statischen Methode mit Hilfe des Klassen-Namens

Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012

8

Statische Methoden Die Klasse Console hat lauter statische Dienst-Methoden. Console.WriteLine(), Console.ReadLine(), …

Die Main Methode ist immer statisch. Es kann (zu Beginn) gar kein Objekt geben, mit welchem die Main Methode aufgerufen werden kann. static void Main(string[] args) {

. . . }

9

Statische Methoden Weiteres Beispiel // Eulersche Zahl

private const double E = 2.718281828459045235; //statische Methode, um Pi zu berechnen benutzt statische Methode aus Math

public static double GetPi() { return 2 * Math.Acos(0); } //statische Methode darf auf const zugreifen

public static double GetE() { return E; }

10

Eigenschaften / Properties Definition und Merkmale

11

Definition: Properties Properties sind Methoden, die einen flexiblen Mechanismus zum Lesen, Schreiben oder Berechnen von Werten von privaten Feldern zur Verfügung stellen. Properties werden wie öffentliche Felder verwendet, sind aber spezielle Zugriffs-Methoden. Mit Properties kann wie auf öffentliche (public) Felder zugegriffen werden motor.Model = "Diesel-Motor"; // schreiben String ausgabe = motor.Model; // lesen

12

Eigenschaften von Properties Properties sind ein Gemisch von Feld und Methode. Das Lesen einer Property geschieht über die Get-Methode Die Get-Methode macht die Daten auf einfache Weise verfügbar, auch wenn diese Daten von einer beliebigen Quelle stammen, z. B. einer Datenbank. // vorher nicht lesbar Umwandeln der privaten radiusVariable in eine (lesbare) Property Radius

13

Eigenschaften von Properties Das Schreiben einer Property geschieht über die Set-Methode Mithilfe des value-Schlüsselworts wird der Wert definiert, der von der set-Methode zugewiesen wird. Properties bieten alle Möglichkeiten von normalen Methoden. // vorher nicht lesbar Umwandeln der privaten radiusVariable in eine (les- und schreibbare) Property Radius

14

Eigenschaften von Properties Die Set-Methode kann die Daten überprüfen, bevor eine Änderung zugelassen wird. Über Properties kann eine Klasse das Abrufen und Festlegen von Werten verfügbar machen Für den Benutzer eines Objekts sieht eine Property wie ein Feld aus gleicher Zugriff wie auf ein public Feld Zugriff über get-Methode

15

Zugriffsmodifizierer

16

Sichtbarkeit der Properties Die Sichtbarkeit der Property wird durch einen ZugriffsModifizieren definiert public int Month { get { . . . } set { . . . } }

Properties können Get- und Set-Methoden haben, oder auch nur eine Get- oder eine Set-Methode. Eine Property ohne Get-Methode ist lesegeschützt. Eine Property ohne Set-Methode ist schreibgeschützt.

17

Sichtbarkeit der Get-und Set-Methoden Falls keine Angabe gemacht wird, entspricht die Sichtbarkeit der beiden Zugriffsmethoden get und set per Vorgabe der Sichtbarkeit der Eigenschaftsmethode. public int Month { get { . . . } set { . . . } }

Ist die Property public definiert, sind get und set automatisch ebenfalls public.

18

Sichtbarkeit der Get-und Set-Methoden Jede Zugriffsmethode darf auch eine individuelle Sichtbarkeit aufweisen. Damit lässt sich der jeweilige Zugriff im Bedarfsfall steuern. public int Month { get { . . . } private set { . . .

}

}

Month ist public, also ist der Lese-Zugriff (get) ebenfalls public. Die Set-Methode ist private und darf nur von der Klasse selbst verwendet werden. 19

Beispiele

20

Beispiel1: TimePeriod Zeitmessung in Sekunden, Lese Zugriff auch in Minuten oder Stunden class TimePeriod { private int seconds; public int Seconds { get { return seconds; } set { seconds = value; } }

public TimePeriod(int s) { seconds = s; }

// Member Variable

// Anzahl Sekunden // Eigenschaft lesen // Eigenschaft schreiben

// Konstruktor

21

Beispiel1: TimePeriod Lese Zugriff auch in Minuten oder Stunden

Umrechnung

public double Minutes { get { return Seconds / 60.0; } }

// Weitere Eigenschaft: // Zeit in Minuten

public double Hours { get { return Seconds / 3600.0; } }

// Weitere Eigenschaft: // Zeit in Stunden

}

22

Beispiel1: TimePeriod -> Benutzen der Properties

Lesezugriff auf Sekunden Minuten, Stunden

Schreibzugriff auf Sekunden

23

Beispiel2: Würfel Eigenschaft Seitenlänge, Berechnen von Mantelfläche und Inhalt public class Wuerfel { private double seite; public double Seite // Eigenschaft Seite ( positiv! ) { // lesen und überschreiben get { return seite; } set { seite = Math.Abs(value); } }

public Wuerfel(double s) { Seite = s; }

// //

Konstruktor seite immer positiv!

24

Beispiel2: Wuerfel public double Mantel // Eigenschaft Mantelfläche, nur lesen { get { return 6 * seite * seite; } } public double Inhalt() // „normale“ Methode { return seite * seite * seite; } } Wuerfel wuerfel = new Wuerfel(0); wuerfel.Seite = 2.1; double mantel = wuerfel.Mantel; double inhalt = wuerfel.Inhalt();

// set Methode // get Methode // normale Methode

25

Nebeneffekte

26

Nebeneffekte Die Set-und Get-Methoden können gleichzeitig auch andere Anweisungen ausführen, z. B. Werte von anderen Feldern verändern. Dies kann eine gute oder eine weniger gute Idee sein.

private String matNR; public String MatrikelNR { get { . . . } set { matNR = value; semester=1; } }

// weniger gute Idee

Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012

27

Nebeneffekte Die get-Methode darf den Wert der Property nicht verändern (Umgehung der Set-Methode). private int number; public int Number { // schlechte Idee! get { return number++; } }

Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012

28

Nebeneffekte Die get-Methode kann fehlende Werte durch einen Default Wert ersetzen. class Person{ private String name; public String Name { // Default Wert zurückgeben get { if(name != null) return name; else return "Name unbekannt"; } set { name = value; } } . . . }

29

Nebeneffekte Die Set-Methode kann die Gültigkeit der Eingabe prüfen private double weight= 0; public double Weight { set { if (value > 0) weight = value; else { Console.WriteLine("Warnung: negatives Gewicht korrigiert!"); weight = -value; } } }

Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012

30

Nebeneffekte public class DateOfBirth { private int month; private int day; private int year; public int Month { get { return month; } // nur gültige Werte zulassen set { if( (value > 0) && (value < 13) ) { month = value; } else { Console.WriteLine("ungültige Monats-Eingabe"); } } } . . . // analog für Tag und Jahr }

31

Abkürzung get; set; Falls die Get- und Set-Methode reine Zugriffsmethoden sind, kann der Code abgekürzt werden. Der Wert wird dann anonym gespeichert. class TimePeriod { // verstrichene Zeit in Sekunden

public int Seconds { get; // lesen set; // schreiben } } anstatt

32