4. Eigene Methoden erstellen
• Beispiel:
static int square(int x) {
return x * x;
}
• Allgemeine Syntax
static ret_type mname(type1 p1, type2 p2, …) {
expr
}
• Name: mname
gleiche Regeln wie bei Variablen
• Parameter: p1, p2, …
0 bis „unendlich“ Parameter möglich! Ist fest
• Anweisungen: expr
04.12.2013
4
5. Rückgabewert eine Methode
• Allgemeine Syntax
static ret_type square(type1 p1, type2 p2, …) {
expr
}
• Rückgabewert: ret_type
Ergebnis der gesamten Verarbeitung / Durchführung
Rückgabewert wird durch return „markiert“.
• Analogie:
Funktion ist ein Automat. Nur das Ergebnis (vgl. Rückgabewert) ist für den Aufrufer
sichtbar. Lediglich die nötigen Eingaben/Einstellung (vgl. Parameter) wie zum Beispiel
Münzen sind notwendig für die Betriebsaufnahme!
• Spezialfall: void
• Englische Begriff: „invoke“ „call“
04.12.2013
5
6. Rückgabewerte
• Was passiert wenn eine Funktion einen Rückgabewert spezifiziert (sprich nicht
mit void definiert wurde) aber keinen Rückgabewert zurückgibt?
Antwort: Compilerfehler
• Was passiert wenn Anweisungen nach der return Anweisungen stehen?
Antwort: Warnung vom Compiler.
• Was passiert wenn nicht jeder Ausführpfad (zum Beispiel durch if-else) einen
Rückgabewert liefert?
Antwort: Compilerfehler
04.12.2013
6
9. Gültigkeitsbereich von Variablen
• Lokalen Variable der Methode
Ist nur gültig innerhalb des Methodenrumpfes
• Parametervariable
Äquivalent zu lokalen Variablen
• Variable, die übergeben werden
Ist innerhalb der Methode nicht definiert!
• Rückgabewert
Ist nur an der Rücksprungadresse gültig
04.12.2013
9
11. Möglichkeiten der Übergabe
• Passing by value
Für jeden Parameter wird eine Copy erstellt. Veränderungen werden nicht
gespeichert.
Standardmethode
• Passing by Reference mit ref
Änderungen werden beibehalten
Parameter muss zuvor initialisiert werden!
• Passing by Reference mit out
Änderungen werden beibehalten
Keine Initialisierung nötig!
04.12.2013
11
15. Refactoring
• Refactoring
Antwort auf „Mein Code ist häßlich“
Formal: Teilaufgabe vom Codewartung zur Steigerung der Lesbarkeit vom Code
• Methoden extrahieren
Neue Funktion anhand von Codeblock extrahieren
• Methodenstub
Neue Funktion anhand eines Prototyps definieren
• Variablen umbenennen (engl. Rename)
Umbenennung mit Kontextinformation
• Parameter umordnen (engl. Reorder Parameters)
Parameterreihenfolge
04.12.2013
15
19. Methoden überladen
• Definition mehrere Methoden mit dem gleichem Namen aber unterschiedliche
Signatur
• Signatur:
Parameterordnung:
Parametertyp
Parameteranzahl
swap(int i, double d)
square(int a)
max(int a1)
und swap(double d, int i)
und square(double d)
und max(int a1, int a2)
• Was ist aber mit variable Parameterliste?
max(int a1, int a2) und max(params int[] a)
Aufruf: max(1, 2)
04.12.2013
19
20. Anmerkung
• Rekursion
Aufruf einer Funktion in sich selbst
Beispiel: Addition über Rekursion
static int add(int a, int b) {
return b == 0 ? a : add(a, b-1) + 1;
}
Übermäßige Nutzung von Rekursionen führen zum „Stack Overflow“
Anwendung: Teilen und Herrschen (Devide & Conquer)
04.12.2013
20
23. Warum gibt es Klassen?
• Verbinden von Daten und Funktionen
„Array von Personen mit Namen und PLZ“
• Stärkere Validierung der Daten
„Das alter einer Person kann nicht negativ sein“
„Die Note einer Klausur liegt zwischen 1 und 5“
• Sichere Programmausführung
• Leichte Wiederverwertbarkeit
Eine Methode für Ganze Zahlen: int, uint, ulong, long, usw.
• Gute Wartbarkeit
04.12.2013
23
25. Klassen
• Beispiel:
Console, ADO.NET
• Was ist eine Klasse
Datentyp, dass Objekte beschreibt (Bauplan)
Verknüpfen von Daten und Funktionen
• Objekt
Instanzen einer Klasse werden Objekte genannt.
Eine Klasse kann beliebig viele Objekte erzeugen
• Members
Elemente einer Klasse werden Members genannt.
Es gibt funktionale Members und Datenmembers
04.12.2013
25
27. Wie erstellt man eine Klasse
• Allgemeine Syntax
class identifier {
expr
}
• Innerhalb des Klassenrumpfes können die Members definiert werden
Datenmembers wie Felder, etc.
Funktionalen Members wie Methoden, Konstruktoren, etc.
• Objekte einer Klasse erzeugen
Allgemeine Syntax: cname oname = new cname();
Beispiel: Random rnd = new Random();
04.12.2013
27
28. Analogie zur echten Welt
• Zur welche Klasse gehören wir?
Klasse Mensch
• Was bin ich?
Ein Objekt
• Und was bist du?
Ein Objekt
• Welche Members hätte eine Klasse Mensch? (Auszug)
„Es sind Merkmale, die wir alle haben worin wir uns auch unterscheiden?“
04.12.2013
28
30. Objektvariablen (engl. Field)
• Variablen einer Klasse, die an das Objekt gebunden sind, werden
Objektvariablen genannt.
• Objektvariablen sind objektgebunden
Jedes Objekt kann unterschiedliche Werte für seine Feld setzen haben.
Technische Hinweis: bei der Erstellung eines Objektes, wird für jedes definierte Feld
Speicher reserviert.
Beispiel:
•
•
•
Klasse Mensch
Hans heißt „Hans“, während Klaus „Klaus“ heißt
Unterschiedliche Werte für das Feld „Vornamen“.
• Objektvariablen gehören zu den Datenmembers
• Synonym: Felder
04.12.2013
30
31. Objektvariablen
• Allgemeine Syntax
class ClassIdent {
modifier type1 field1;
modifier type2 field2;
expr
}
• Zugriffsmodifizierer
Regulieren den Zugriff auf Members einer Klasse. Sie gilt nur für das jeweilige
Member.
Weitere Members (später)
Zugriffmodifiziere
Beschreibung
public
Zugriff außerhalb der Klasse ist erlaubt
private (default)
Zugriff außerhalb der Klasse ist nicht erlaubt
04.12.2013
31
33. Klassenvariablen
• Variablen einer Klasse, die an die Klasse selbst gebunden sind, werden
Klassenvariablen genannt
• Klassenvariablen klassengebunden
Der Wert einer Klassenvariable ist für alle Objekt gleich. Er kann von jedem Objekt
gelesen und geschrieben werden.
Technische Details: Für die Klasse selbst wird auch Speicher reserviert
Beispiel:
•
Anzahl der lebenden Menschen in der Klasse Mensch
•
Bei der Geburt eines Menschen (Erstellung eines neuen Objektes) wird die Zahl erhöht
•
Wenn der Mensch (Objekt wird gelöscht) stirbt, wird die Zahl verringert
•
Der Wert bleibt aber für alle gleich.
•
Hans und Klaus würden denselben Wert besitzen
Was wären weitere mögliche Klassenvariablen für Klasse Mensch?
04.12.2013
33
38. Konstruktoren (engl. Constructor)
• Beispiel: Aufruf eines Konstruktors
static void Main(string[] args) {
...
Person meier = new Person();
...
}
• Was ist ein Konstruktor?
Eine spezielle Methode der Klasse ohne Rückgabewert, die beim Erzeugen eines
Objektes automatisch aufgerufen wird.
Hauptfunktion: Initialisierung der Datenmembers
•
Konstruktoren haben immer den selben Namen wie die Klasse
04.12.2013
38
40. Konstruktoren
• Syntax
modifier ClassIdent(type1 p1, type2 p2, …) {
expr
}
• Standardkonstruktor
Hat keine Parameter
Wird automatisch erzeugt, wenn kein andere Konstruktor definiert ist
•
Sobald ein Konstruktor definiert wurde, verschwindet die Definition.
•
Soll dennoch ein Standardkonstruktor angeboten werden, muss dieser explizit definiert
werden.
• Konstruktoren mit Parametern
Haben Parameter
In der Praxis werden immer mehrere Konstruktoren dieser Art definiert
04.12.2013
40
41. Konstruktoren
• Jeder Klasse besitzt mindesten einen Konstruktor
• Konstruktoren können sich über die colon – Syntax gegenseitig aufrufen:
modifier ClassIdent(paramlist1) : this (paramlist2) {
expr
}
• Was passiert, wenn modifier nicht public definiert ist?
Es können keine Objekte von aussen definiert werden.
„Design Pattern“: Factory
• Hinweis:
Es gibt auch Destruktoren!
04.12.2013
41
42. Klassenkonstruktor
• Zweck:
dürfen nicht explixit aufgerufen!
Sondern wenn die Klasse zum erst referrenziert wird.
• Besonderheiten
Keine accessibility
Keine Parameter
Können nicht überladen werden
• Syntax:
static ClassIdent(paramlist1) {
expr
}
04.12.2013
42
44. Eigentschaften (engl. Properties)
• „Virtuelle“ Datenmembers
• Datenmembers, die über 2 Methoden realisiert werden:
Get-Accessor:
Set-Accessor:
Wert eines Members lesen
Wert eines Members festlegen
• Eigenschaften sind Datenmember, die über Accessor zugegriffen realisiert
werden
04.12.2013
44
46. Warum Eigentschaften?
• Erweiterte Zugriffskontrolle
Nur Lesezugriff (engl. read-only)
Nur Schreibzugriff (engl. write-only)
• GANZ WICHTIG!
Datenabstraktion
Direkte Zugriff auf Daten wird unterbunden: Validierung & Modellierung
• Vererbarkeit (später)
Anpassung in den „Kinderklassen“
• Reine Lesezugriff ist bei den Felder auch möglich!
04.12.2013
46