2.17 :get()

Mit dieser Methode können an Objekten deren Attribute abgefragt werden. Diese Methode ist an allen Objekten, Modellen und Defaults vordefiniert.

Darüber hinaus ist es möglich, diese Methode zu überschreiben und somit die Art und Weise der Attributabfrage um weitere Aktionen (z.B. Berechnung der Attributwerte erst wenn diese tatsächlich benötigt werden) zu erweitern.

Die dabei zulässigen Attribute für den jeweiligen Objekttyp entnehmen Sie bitte der „Objektreferenz“.

Definition

anyvalue :get
(
      attribute Attribute input
  { , anyvalue  Index     input }
)

Parameter

attribute Attribute input
Dieser Parameter enthält das Attribut, dessen Wert abgefragt wird.
anyvalue Index input
In diesem optionalen Parameter wird der Index des gesuchten Attributs angegeben, falls dieses ein indiziertes Attribut ist. Sein Datentyp muss dem Index-Datentyp des Attributs entsprechen. Also muss hier ein integer-Wert übergeben werden, wenn das Attribut eindimensional ist oder ein index-Wert, wenn das Attribut zweidimensional ist.

Rückgabewert

Wert des gesuchten Attributes mithilfe von return.

Die Weitergabe von fail in überschriebenen, vordefinierten Methoden ist ebenfalls möglich. Dazu gibt es folgende Schlüsselwörter in der Regelsprache:

Syntax

pass <Ausdruck> ;

Wertet einen Ausdruck analog zu einer return-Anweisung aus, um das Resultat daraus an den Aufrufer zurückzugeben. Kommt es dabei zu einem Fehler, so wird dieser Fehlerzustand an den Aufrufer weitergereicht. Eine normale return-Anweisung würde hier abbrechen und bei der nächsten Anweisung weitermachen.

Damit entspricht es quasi der Vereinfachung von

variable anyvalue V;
if fail(V:=<Ausdruck>) then
  throw;
else
  return V;
endif

Syntax

throw ;

Mit diesem Schlüsselwort wird ein Fehler an den Aufrufer weiter signalisiert und die aktuelle Methode beendet.

Beispiel

dialog D
model edittext MEt {
  :get() {
    case Attribute
      in .text:
        if this.content="" then
          throw;
        else
          return this.content;
        endif
    endcase
    pass this:super();
  }
}
on dialog start {
  variable string S := "???";
  print fail(MEt.text);           // => true
  MEt.content := "Hello";
  print fail(S := MEt.text);      // => false
  print S;                        // => Hello
  print fail(MEt:get(.docking));  // => true
  exit();
}

Impliziter Aufruf

Die Methode :get() wird auch implizit aufgerufen. Immer wenn ein Attribut (vordefiniert oder benutzerdefiniert) aus der Regelsprache oder mit einer Schnittstellenfunktion (z.B. DM_GetValue()) abgefragt wird, wird die Methode :get() aufgerufen, die dann den Wert des Attributs zurückliefern muss.

Redefinition

Die Redefinition der Methode :get() wird wie folgt durchgeführt:

window W {
  :get(<keine Parameter!>)
  {
    ...
    Aktionen, um den Wert des gesuchten Attributs zu berechnen.
    ...
  }
}

Innerhalb der Methodendefinition können die Parameter Attribute und Index abgefragt und gesetzt werden, um dann z.B. mit this:super() die Methode :get() der Superklasse mit den entsprechend veränderten Parametern aufzurufen, was allerdings in der Regel nicht sinnvoll ist.

Unterdrückung von rekursiven Aufrufen

Wird in der Methode :get() irgendein Attribut des selben Objektes, für das die Methode :get() bereits aufgerufen worden ist, abgefragt, so müsste eigentlich wieder die Methode :get() für das selbe Objekt implizit aufgerufen werden. Da dabei die Gefahr von Endlosrekursionen sehr groß ist (in vielen Fällen wäre das sogar unvermeidlich), wird ein solcher rekursiver Aufruf unterdrückt.

Beispiel

window {
  :get()
  {
    case (Attribute)
      in .title:
        return “<” + this.title + “>”;  // kein impliziter Aufruf von :get()
      otherwise:
        return this:super();
    endcase
  }
}

In diesem Beispiel werden in der Methode :get() Abfragen des Fenstertitels überwacht und der Titel eingeklammert in <> zurückgeliefert. Dabei wird auf this.title wiederum lesend zugegriffen. Ein impliziter Aufruf der Methode :get() wird jedoch unterdrückt. Die Methode :get() für ein anderes Objekt wird sehr wohl aufgerufen, falls die Attribute des anderen Objektes abgefragt werden.

Aufruf der Methode :get() an der übergeordneten Klasse

Das obige Beispiel zeigt auch den Umgang mit this:super(). Alle Attribute, für die sich die überschriebene Methode :get() nicht zuständig fühlt, sollten an die Superklasse delegiert werden, so dass irgendwann die vordefinierte Methode :get() den Attributwert zurückliefert.

Beispiel

Folgendes Beispiel soll die Aufrufhierarchie der :get()-Methode verdeutlichen.

dialog GET

model record MRec1 {
  string Str;

  :get()
  {
    if Attribute = .Str then
      return "MRec1(" + this.Str + ").";
    else
      return this:super();
    endif
  }
}

model MRec1 MRec2 {
  :get()
  {
    if Attribute = .Str then
      return this:super() + "MRec2(" + this.Str + ").";
    else
      return this:super();
    endif
  }
}

MRec2 RecInst {
  :get()
  {
    if Attribute = .Str then
      return this:super() + "RecInst(" + this.Str + ")";
    else
      return this:super();
    endif
  }
}

on dialog start {
  RecInst.Str := "X";
  // impliziter Aufruf der :get()-Methode
  print "*** Ergebnis Str: " + RecInst.Str;
    // Soll "MRec1(X).MRec2(X).RecInst(X)"
  // expliziter Aufruf der :get()-Methode
  print "*** Ergebnis Str: " + RecInst:get(.Str);
    // Soll "MRec1(X).MRec2(X).RecInst(X)"

  exit();
}

Siehe auch

Eingebaute Funktion getvalue() im Handbuch „Regelsprache“

C-Funktion DM_GetValue im Handbuch „C-Schnittstelle - Funktionen“