Erfassen Sie Ihre Fortschritte
Trailhead-Startseite
Trailhead-Startseite

Erstellen von Klassen und Objekten

Lernziele

Nachdem Sie diese Lektion abgeschlossen haben, sind Sie in der Lage, die folgenden Aufgaben auszuführen:

  • Erläutern der Beziehung zwischen einer Klasse und einem Objekt
  • Definieren eines Parameters
  • Erläutern der Unterschiede zwischen Rückgabewerten

Wenn dies Ihre erste Station auf dem Trail "Entwickeln von Apex-Programmierkenntnissen" ist, sind Sie schon zu weit gekommen. Gehen Sie einen Schritt zurück zum Modul Apex – Grundlagen für Administratoren. Wenn Sie sich schon den Badge "Apex – Grundlagen für Administratoren" verdient haben, sind Sie hier genau richtig. 

In "Apex – Grundlagen für Administratoren" haben Sie sich mit der Syntax, Variablen, Sammlungen und bedingten Anweisungen von Apex vertraut gemacht. Sie haben auch schon Beispielcode in der Developer Console ausgeführt. In diesem Modul bauen wir auf diesen Konzepten auf. Los geht's.

Was bedeutet objektorientiert?

Wenn Sie etwas über Softwareentwicklung oder Programmierung gelesen haben, sind Sie vielleicht schon auf den Begriff objektorientiert gestoßen: objektorientierte Klassen, objektorientierte Konzepte, objektorientierte Programmierung. Doch was bedeutet objektorientiert? 

Bei Programmiersprachen bedeutet es, dass sich der Code auf die Beschreibung von Objekten konzentriert. Ein Objekt kann alles sein, was eindeutige Eigenschaften hat, wie z.B. eine Person, ein Account oder sogar eine Blume. Ehe Sie wirklich verstehen können, was objektorientiert bedeutet, gibt es zwei Dinge, die Sie unbedingt verstehen müssen: Klassen und Objekte. 

Klassen

Eine Klasse ist eine Blaupause. Objekte basieren auf Klassen. Eine Klasse definiert eine Reihe von Merkmalen und Verhalten, die alle Objekte dieser Klasse gemeinsam haben.

Denken Sie an eine Blume. Sie hat Eigenschaften wie Farbe und Höhe und hat Verhalten wie Wachsen und Welken. In einer Apex-Klasse werden die Merkmale als Variablen und die Verhalten als Methoden bezeichnet.

Eine einzelne Blume.

Merkmale (Variablen)
Verhalten (Methoden)
color
Grow
height
Pollinate
maxHeight
Wilt
numberOfPetals

Stellen Sie sich einen Garten vor. Obwohl Rosen, Lilien und Gänseblümchen unterschiedliche Farben und Höhen haben, sind sie alle Blumen mit einer Farbe und Höhe.

Eine dezent farbige Blume, die die Klasse darstellt, mit drei kleineren Blumen darunter, die die Instanzen der Klasse darstellen.

Deklarieren einer Klasse 

Dieser Code deklariert (erstellt) eine Klasse:

public class Flower { //Hauptteil der Klasse }

Klassen werden mithilfe von vier Elementen deklariert: Zugriffsmodifizierer, Schlüsselwort "class", Name der Klasse und Hauptteil der Klasse. Im Hauptteil (innerhalb der geschweiften Klammer { }) werden Methoden und Variablen der Klasse definiert. 

Zugriffsmodifizierer

Ein Zugriffsmodifizierer ist ein Schlüsselwort in einer Klassen- oder Methodendeklaration. Der Zugriffsmodifizierer bestimmt, was anderer Apex-Code sehen und wie er die Klasse oder Methode verwenden kann. Obwohl es andere Zugriffsmodifizierer gibt, ist public der gebräuchlichste. "public"-Klassen stehen in allen anderen Apex-Klassen in Ihrer Organisation zur Verfügung.  

Methoden

Methoden werden innerhalb einer Klasse definiert. Eine Methode beschreibt die Verhalten, die von Objekten dieser Klasse geerbt werden. Eine Klasse kann eine oder mehrere Methoden haben. Die Klasse "Flower" hat drei Methoden (Verhalten): grow, pollinate und wilt.

Eine Methode wird wie folgt deklariert (erstellt):

public static Integer wilt(Integer numberOfPetals){ //Hauptteil der Methode }

Parameter

Beim Erstellen von Methoden kennen Sie nicht immer jeden Wert, der zum Ausführen des Codes benötigt wird. Oftmals schreiben Sie eine Methode, die eine Aufgabe erledigt, und dann eine zweite, um eine ähnliche Aufgabe zu erledigen, usw. Im Nachhinein stellen Sie fest, dass alle Ihre Methoden fast das Gleiche tun. Sie sind also Duplikate mit kleinen Variationen. 

Wenn es nur eine Möglichkeit gäbe, einer einzigen Methode eine vielfältigere Eingabe zu ermöglichen. Aber, Moment! Wir können Parameter verwenden! Ein Parameter ist eine Variable, die als Platzhalter dient und darauf wartet, einen Wert zu erhalten. Parameter werden ähnlich wie Variablen deklariert, mit einem Datentyp gefolgt vom Parameternamen. Bei der folgenden Deklaration hat die wilt-Methode einen Parameter namens numberOfPetals. (Obwohl Sie beliebige Parameternamen verwenden können, ist es sinnvoll, Namen zu verwenden, die den Wert beschreiben, den der Parameter enthält.) Der Parameter numberOfPetals erwartet, dass er einen Wert erhält, dessen Datentyp "integer" ist.

<p>public static void wilt (Integer numberOfPetals){</p><p> //Hauptteil der Methode</p><p>}</p>

Wie können wir die wilt-Methode aufrufen (verwenden)? In diesem Codebeispiel ruft die erste Zeile die Methode auf und übergibt (sendet) den Wert 4. Der Wert, den Sie übergeben, wird als Argument bezeichnet. Das Argument (in diesem Fall 4) wird hinter dem Methodennamen in Klammern eingefügt.

wilt(4);
public static void wilt(Integer numberOfPetals){
    system.debug(numberOfPetals);
}

Nachdem ein Wert an eine Methode übergeben wurde, die einen Parameter enthält, wird der Wert des Arguments zum Wert des Parameters. Der Parameter fungiert als Variable, weshalb Sie ihn wie jede andere Variable handhaben können. 

Schauen wir uns die Flower-Klasse näher an.

public class Flower {
    public static void wilt(Integer numberOfPetals){
        if(numberOfPetals >= 1){
            numberOfPetals--;
        }
    }
}

In den Zeilen 2-6 der Flower-Klasse prüft die wilt-Methode den Wert von numberOfPetals. Wenn diese Zahl größer oder gleich 1 ist, verringert (reduziert) die wilt-Methode numberOfPetals um eins. 

Rückgabetypen

Stellen Sie sich vor, Sie sind in einem Restaurant und möchten wissen, ob ein saisonales Gericht angeboten wird. Sie fragen den Kellner: "Gibt es einen Sommersalat?" Sie erwarten eine bestimmte Art von Antwort, keine Zahl oder ganzen Satz, sondern entweder "ja" oder "nein". 

Bei einer Methodendeklaration muss der erwartete Rückgabetyp explizit angegeben werden. So wie ein Argument mit dem vom Parameter angegebenen Datentyp übereinstimmen muss, muss auch eine zurückgegebene Variable mit dem in der Methodendeklaration angegebenen Rückgabetyp übereinstimmen. Der Rückgabetyp ist ein bestimmter Datentyp, wie z.B. Boolean, String oder Account, oder er kann void (ungültig) sein, wie hier:

public static void wilt(Integer numberOfPetals){
    system.debug(numberOfPetals);
}

Wenn der Rückgabetyp der Methode void ist, gibt die Methode keinen Wert zurück. Um einen Wert zurückzugeben, ersetzen Sie void durch einen anderen Rückgabetyp. 

Hier erwartet die wilt-Methode beispielsweise einen return-Wert (Rückgabewert), der eine ganze Zahl ist.

public static Integer wilt(Integer numberOfPetals){ //Hauptteil der Methode }

public static Integer wilt(Integer numberOfPetals){
    if(numberOfPetals >= 1){
        numberOfPetals--;
    }
    return numberOfPetals;
}

In Zeile 1 bedeutet das Schlüsselwort Integer (unmittelbar nach public static), dass die Methode einen Wert zurückgibt, der eine ganze Zahl ist. In Zeile 5 wird das Schlüsselwort return verwendet, gefolgt vom Variablennamen numberOfPetals, um den resultierenden Wert von numberOfPetals zurückzugeben. Wenn eine Methode einen Variablenwert zurückgibt, muss der variable Datentyp mit dem Rückgabetyp übereinstimmen, den die Methode deklariert hat. In diesem Fall wird erwartet, dass die wilt-Methode einen Ganzzahlwert zurückgibt und die Variable numberOfPetals eine ganze Zahl ist. 

Lassen Sie uns die Methoden wilt, grow und pollinate testen. Zuerst beenden wir die Programmierung der Methoden.

Schreiben der Methoden

  1. Klicken Sie in der Developer Console auf File | New | Apex Class.
  2. Geben Sie Flower als Klassennamen ein.
  3. Klicken Sie auf OK.
  4. Ersetzen Sie in der Klasse "Flower.apxc" den vorhandenen Code durch diesen Code:
  5. public class Flower {
        public static Integer wilt(Integer numberOfPetals){
            if(numberOfPetals >= 1){
                numberOfPetals--;
            }
            return numberOfPetals;
        }
        public static void grow(Integer height, Integer maxHeight){
            height = height + 2;
            if(height >= maxHeight){
                pollinate();
            }
        }
        public static void pollinate(){
            System.debug('Pollinating...');
        }
    }
  6. Klicken Sie auf File | Save.

Sie verfügen nun über eine vollständig definierte Klasse, die Sie testen können. Alles, was Sie benötigen, ist der Klassenname (Flower), die Methoden, die Sie testen möchten (wilt und grow), und die erforderlichen Argumente jeder Methode. Da die "grow"-Methode die "pollinate"-Methode aufruft (verwendet), müssen Sie die "pollinate"-Methode nicht direkt aufrufen. Die wilt-Methode erwartet einen Ganzzahlwert (für den Parameter numberOfPetals) und gibt einen Ganzzahlwert zurück. Die Methoden grow und pollinate geben nichts zurück. 

Ausführen der Methoden

  1. Klicken Sie auf Debug | Open Execute Anonymous Window.
  2. Fügen Sie in das Fenster "Enter Apex Code" diesen Code ein:
  3. Flower.wilt(4);
    Flower.grow(5, 7);
  4. Wählen Sie Open log aus und klicken Sie auf Execute. Das Ausführungsprotokoll wird mit dem Ergebnis der Ausführung des Codes geöffnet.
  5. Wählen Sie Debug Only aus.

Die grow-Methode hat die beiden Parameter height und maxHeight

Flower.grow(5, 7); übergibt die Argumente 5 (Höhe ist 5 Zoll) und 7 (maximale Höhe ist 7 Zoll) an die grow-Methode. Die grow-Methode fügt 2 zur height-Variablen (Zeile 9) hinzu und prüft anschließend den Wert der height-Variablen. Wenn der Wert der "height"-Variablen größer oder gleich dem Wert der "maxHeight"-Variablen ist, ruft die "grow"-Methode die "pollinate"-Methode auf.

Die "pollinate"-Methode gibt nichts zurück, da ihr Rückgabetyp "void" ist.

Was ist passiert?

Sie sollten sich einen Eintrag im Debug-Protokoll ansehen.

Event: USER_DEBUG. Details: [18]|DEBUG|Pollinating…

Was wird wohl passieren, wenn Sie 2 und 6 für die "grow"-Parameter verwenden? Probieren Sie es aus. 

Was passiert?

Mit Blick auf die Debug-Protokolle scheint es so, als passiere nichts. Was passiert, ist, dass durch Festlegen von "height" auf 2 und "maxHeight" auf 6 die Bedingung in der IF-Anweisung "false" wird, sodass die pollinate-Methode nicht ausgeführt wird. 

Objekte

Denken Sie daran, dass die Flower-Klasse eine Blaupause für die Erstellung von Blumen ist. Sie weist die Variablen color, height, maxHeight und numberOfPetals auf. Diese Variablen sind gleich null (ohne Wert), können aber Standardwerte aufweisen.  

Ein Objekt ist eine Instanz einer Klasse. So wie Kinder genetische Merkmale wie Augenfarbe und -größe von ihren Eltern erben, erben Objekte Variablen und Methoden von ihren Klassen. 



color = null;
height = null;
maxHeight = null;
numberOfPetals = null;
Flower Class
Muted shade flower.


grow()

pollinate()

wilt()
Yellow flower.
Red flower.
Pink flower.
color = 'yellow';
color ='red';
color = 'pink';
height = 3;
height = 6;
height = 9;
maxHeight = 6;
maxHeight = 8;
maxHeight = 9;
numberOfPetals = 4;
numberOfPetals = 6;
numberOfPetals = 10;
Flower tulip = new Flower();
tulip.grow();

Flower rose = new Flower();
rose.grow();

Flower peony = new Flower();
peony.grow();

Das tulip-Objekt ist eine Instanz der Flower-Klasse. Jedes der drei Blumenobjekte ist eine bestimmte Blume, die auf der Flower-Klasse basiert. Um eine Instanz namens tulip zu erstellen, die auf der Flower-Klasse basiert, verwenden Sie diese Syntax:

Flower tulip = new Flower();

Sie können die Methoden eines Objekts mit der Punktnotation aufrufen. Fügen Sie einfach .method(); hinter dem Objektnamen hinzu. Beispiel:

tulip.grow();

Jetzt wissen Sie, dass Objekte Instanzen von Klassen sind. Innerhalb einer Klasse beschreiben Variablen das Objekt. Methoden definieren die Aktionen, die das Objekt ausführen kann. Sie haben auch mit Parametern gearbeitet, um übergebene Werte in einer Variablen zu empfangen, und mit Rückgabetypen, die etwas (oder je nach Datentyp nichts) an eine Methode zurücksenden.

Ressourcen