Klassen

Ein Klasse ist ein Sprachelement, welches das Erstellen von eigenen, benutzerdefinierten Typen erlaubt, indem Variablen anderer Typen, Methoden und Ereignisse zusammengefasst werden. Eine Klasse ist mit einem Entwurf vergleichbar (Deklaration). Sie definiert die Daten und das Verhalten eines Typs. Sofern die Klasse nicht statisch deklariert ist, werden die Klassenelemente durch Erstellen von Objekten oder Instanzen verwendet, welche einer Variable zugeordnet sind (sog. „Instanz-Variable“, bzw. auch „Objekt-Pointer“). Das Objekt verbleibt im Arbeitsspeicher, bis keine Verweise mehr darauf existieren. Im Gegensatz dazu, existiert bei einer statisch deklarierten Klasse nur eine einzige Kopie im Arbeitsspeicher und der Zugriff auf Klassenelemente (Member) kann nur über den Klassennamen selbst erfolgen, nicht über eine Instanzvariable.

Im Gegensatz zu Strukturen unterstützen Klassen die Vererbung, sowie Methoden als „Member“

Konstanten, Eigenschaften, Methoden und Ereignisse für eine Klasse werden zusammen als Klassenmember bezeichnet.

Zugriffs-Einschränkung

Die Einschränkung des Zugriffs auf einzelne oder mehrere Member einer Klasse erfolgt mittels der Schlüsselwörter (sog. „Zugriffsmodifizierer“):

Schlüsselwort Bedeutung
public Zugriff nicht beschränkt
private Der Zugriff ist auf die enthaltende Klasse beschränkt.
protected Der Zugriff ist auf die enthaltende Klasse oder auf Typen beschränkt, die von der enthaltenden Klasse abgeleitet sind.

Das Schlüsselwort Me ist ein Verweis auf das Objekt auf das sich ein Aufruf bezieht.

class Example
  dim Title as string = "My Example Class"
  procedure ShowTitle()
    print me.Title
  endproc
endclass

Erstellen von Objekten

Obwohl sie oft zusammen als Begriff erscheinen, sind eine Klasse und ein Objekt unterschiedliche Dinge. Eine Klasse definiert einen Typ eines Objekts, aber es ist kein Objekt selbst. Ein Objekt ist eine konkrete Entität im Speicher, basierend auf einer Klasse als Bauplan und wird als Instanz einer Klasse bezeichnet. Objekte können mithilfe des Schlüsselworts new erstellt werden, gefolgt vom Namen der Klasse, auf die das Objekt basiert. Dabei wird anhand übergebener Parameter der entsprechend passende Konstruktor einer Klasse aufgerufen.

dim object1 as Customer
object1 = new Customer()

Wenn eine Instanz einer Klasse im Speicher erstellt wird, erhält man einen Verweis (Zeiger) als Rückgabewert. Im vorherigen Beispiel ist object1 ein Verweis auf ein Objekt, das auf Customer basiert. Dieser Verweis bezieht sich auf das neue Objekt. Die Variable object1 enthält also nicht die Objektdaten selbst.

Bei der Zuweisung dieser Variable zu einer Weiteren gleichen Typs, wird ein neuer Verweis erstellt, kein neues Objekt im Speicher:

dim object3,object4 as Customer
object3 = new Customer()
object4 = object3

Obiger Code erstellt zwei Verweise, die beide auf dasselbe Objekt verweisen. Aus diesem Grund werden alle Änderungen am Objekt, welche über object3 getätigt worden sind, bei nachfolgenden Verwendungen von object4 berücksichtigt. Im Unterschied zum Datentyp Ptr werden alle Verweise eines Objekts überwacht und das Objekt automatisch aus dem Speicher entfernt, wenn keine Verweise mehr darauf existieren.

Dasselbe passiert, wenn ein Objekt als Parameter einer Methode übergeben wird:

dim object1 as Customer
object1 = new Customer()
myFunction( object1 )

Solange das Unterprogramm „myFunction()“ ausgeführt wird, existieren zwei Verweise auf das Objekt von object1. Auch hier werden alle Änderungen am Objekt, welche innerhalb des Unterprogramms am Objekt getätigt worden sind, bei nachfolgenden Verwendungen von object1 berücksichtigt.

Die Vererbung erfolgt durch Verwendung einer Ableitung, d.h., dass eine Klasse mithilfe einer Basisklasse deklariert wird, aus der Sie Daten und das Verhalten erbt. Eine Ableitung von einer Basisklasse wird durch die Verwendung des Schlüsselwortes inherits angegeben:

class Mike
  inherits Human 'all public or private properties, methods, events are inherited
  dim FavouriteFood as string
endclass

Wenn eine Klasse eine Basisklasse deklariert, erbt sie alle Member der Basisklasse mit Ausnahme der Konstruktoren.

Variablen die in einem Klassen-Körper angelegt werden, sind Eigenschaften einer Klasse.

class Vehicle
  public
  dim Type as string
endlcass 

Eine Eigenschaft kann wie jede andere Variable gelesen und beschrieben werden:

dim car as Vehicle
car = new Vehicle
car.Type = "Truck"
print car.Type 'Ausgabe: Truck

Wenn eine Klasseninstanz, also ein Objekt aus einer Klasse erstellt wird, wird deren Konstruktor aufgerufen. Ein Konstruktor ist eine Klassen-Methode mit dem Namen Constructor. Ein Rückgabetyp ist nicht enthalten. Eine Klasse kann über mehrere Konstruktoren verfügen, welche unterschiedliche Argumente verwenden (siehe: Überladen von Methoden. Mit Konstruktoren können Programmierer Standardwerte festlegen, Instanziierungen einschränken und Code schreiben, der flexibel und leicht zu lesen ist.

class Human
  private
  dim last as string = "human"
  dim first as string = "unknown"
 
  public
  procedure Constructor( firstName as string )
    me.first = firstName
  endproc
  procedure Constructor( lastName as string, firstName as string )
    me.last  = lastName
    me.first = firstName
  endproc
  function Name() as string
    return firstName+" "+lastName
  endfunc
  'more implementation of the "Human" class

Der Aufruf des jeweiligen Konstruktors erfolgt anhand der Anzahl und Art der Argumente:

dim Person as Human
Person = new Human
print Person.Name 'Ausgabe: "unknown human"
dim Person as Human
Person = new Human("Mike")
print Person.Name 'Ausgabe: "Mike human"
dim Person as Human
Person = new Human("Planck","Max")
print Person.Name 'Ausgabe: "Max Planck"

Methoden in einer Klasse sind wie normale Unterprogramme die eine Reihe von Anweisungen enthalten. Jeder Klassen-Methode, welche nicht als statisch deklariert wurde, wird automatisch ein Verweis auf das aktuelle Objekt mitgegeben, auf das sich der Aufruf bezieht. Der Verweis auf das aktuelle Objekt erfolgt durch das Schlüsselwort Me.

Die Art von Methoden in einer Klasse kann durch Schlüsselwörter beeinflusst werden.

Schlüsselwort Bedeutung
static Statische Methode. Es muss keine Klassen-Instanz (also ein Objekt) erzeugt werden um die Methode aufrufen zu können, jedoch existiert hiermit auch kein Verweis auf das aufrufende Objekt über das Schlüsselwort Me.
class myClass
  public
  dim Title as string = "my example class"
  static procedure Help()
    print "Help Screen"
  endproc
endclass
'...
 
'call static method of class "Human":
Human.Help()
 
'also possible via class instance:
dim Person as Human
'for non-static methods this throws a runtime-error, because there is no object existing yet:
Person.Help()
'create new instance
Person = new Human
Person.Help()