F # - Klassen

Klassen sind Typen, die Objekte darstellen, die Eigenschaften, Methoden und Ereignisse haben können. "Sie werden verwendet, um Aktionen, Prozesse und konzeptionelle Entitäten in Anwendungen zu modellieren."

Syntax

Die Syntax zum Definieren eines Klassentyps lautet wie folgt:

// Class definition:
type [access-modifier] type-name [type-params] [access-modifier] ( parameter-list ) [ as identifier ] =
   [ class ]
      [ inherit base-type-name(base-constructor-args) ]
      [ let-bindings ]
      [ do-bindings ]
      member-list
      ...
   [ end ]

// Mutually recursive class definitions:
type [access-modifier] type-name1 ...
and [access-modifier] type-name2 ...
...

Wo,

  • Das type-nameist eine gültige Kennung. Der Standardzugriffsmodifikator hierfür istpublic.

  • Das type-params beschreibt optionale generische Typparameter.

  • Das parameter-listbeschreibt Konstruktorparameter. Der Standardzugriffsmodifikator für den Primärkonstruktor istpublic.

  • Das identifier verwendet mit dem optionalen as Das Schlüsselwort gibt der Instanzvariablen einen Namen, oder self-identifier, Dies kann in der Typdefinition verwendet werden, um auf die Instanz des Typs zu verweisen.

  • Das inherit Mit dem Schlüsselwort können Sie die Basisklasse für eine Klasse angeben.

  • Das let Mit Bindungen können Sie Felder oder Funktionswerte lokal für die Klasse deklarieren.

  • Das do-bindings Der Abschnitt enthält Code, der bei der Objektkonstruktion ausgeführt werden soll.

  • Das member-list besteht aus zusätzlichen Konstruktoren, Instanz- und statischen Methodendeklarationen, Schnittstellendeklarationen, abstrakten Bindungen sowie Eigenschafts- und Ereignisdeklarationen.

  • Die Schlüsselwörter class und end Diese Markierungen für den Beginn und das Ende der Definition sind optional.

Konstruktor einer Klasse

Der Konstruktor ist Code, der eine Instanz des Klassentyps erstellt.

In F # arbeiten Konstruktoren kaum anders als andere .NET-Sprachen. In der Klassendefinition werden die Argumente des Primärkonstruktors als Parameterliste beschrieben.

Der Körper des Konstruktors besteht aus dem let und do Bindungen.

Sie können zusätzliche Konstruktoren hinzufügen, indem Sie das neue Schlüsselwort verwenden, um ein Mitglied hinzuzufügen.

new (argument-list) = constructor-body

Das folgende Beispiel veranschaulicht das Konzept -

Beispiel

Das folgende Programm erstellt eine Linienklasse zusammen mit einem Konstruktor, der die Länge der Linie berechnet, während ein Objekt der Klasse erstellt wird.

type Line = class
   val X1 : float
   val Y1 : float
   val X2 : float
   val Y2 : float

   new (x1, y1, x2, y2) as this =
      { X1 = x1; Y1 = y1; X2 = x2; Y2 = y2;}
      then
         printfn " Creating Line: {(%g, %g), (%g, %g)}\nLength: %g"
            this.X1 this.Y1 this.X2 this.Y2 this.Length

   member x.Length =
      let sqr x = x * x
      sqrt(sqr(x.X1 - x.X2) + sqr(x.Y1 - x.Y2) )
end
let aLine = new Line(1.0, 1.0, 4.0, 5.0)

Wenn Sie das Programm kompilieren und ausführen, wird die folgende Ausgabe ausgegeben:

Creating Line: {(1, 1), (4, 5)}
Length: 5

Bindungen binden lassen

Mit den let-Bindungen in einer Klassendefinition können Sie private Felder und private Funktionen für F # -Klassen definieren.

type Greetings(name) as gr =
   let data = name
   do
      gr.PrintMessage()
   member this.PrintMessage() =
      printf "Hello %s\n" data
let gtr = new Greetings("Zara")

Wenn Sie das Programm kompilieren und ausführen, wird die folgende Ausgabe ausgegeben:

Hello Zara

Bitte beachten Sie die Verwendung der Selbstkennung gr für die Greetings- Klasse.