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.