F # - Klasy
Klasy to typy reprezentujące obiekty, które mogą mieć właściwości, metody i zdarzenia. „Służą do modelowania działań, procesów i wszelkich pojęć w aplikacjach”.
Składnia
Składnia definiowania typu klasy jest następująca -
// 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 ...
...
Gdzie,
Plik type-nameto dowolny prawidłowy identyfikator. Domyślnym modyfikatorem dostępu do tego jestpublic.
Plik type-params opisuje opcjonalne parametry typu ogólnego.
Plik parameter-listopisuje parametry konstruktora. Domyślnym modyfikatorem dostępu dla głównego konstruktora jestpublic.
Plik identifier używany z opcjonalnym as słowo kluczowe nadaje nazwę zmiennej instancji lub self-identifier, których można użyć w definicji typu, aby odwołać się do wystąpienia typu.
Plik inherit słowo kluczowe umożliwia określenie klasy bazowej dla klasy.
Plik let powiązania umożliwiają deklarowanie pól lub wartości funkcji lokalnie dla klasy.
Plik do-bindings sekcja zawiera kod, który ma zostać wykonany podczas budowy obiektu.
Plik member-list składa się z dodatkowych konstruktorów, deklaracji instancji i metod statycznych, deklaracji interfejsów, abstrakcyjnych powiązań oraz deklaracji właściwości i zdarzeń.
Słowa kluczowe class i end zaznaczające początek i koniec definicji są opcjonalne.
Konstruktor klasy
Konstruktor to kod, który tworzy instancję typu klasy.
W języku F # konstruktorzy działają trochę inaczej niż inne języki .Net. W definicji klasy argumenty konstruktora podstawowego są opisane jako lista-parametrów.
Ciało konstruktora składa się z let i do wiązania.
Możesz dodać dodatkowe konstruktory, używając słowa kluczowego new, aby dodać członka -
new (argument-list) = constructor-body
Poniższy przykład ilustruje koncepcję -
Przykład
Poniższy program tworzy klasę linii wraz z konstruktorem, który oblicza długość linii podczas tworzenia obiektu tej klasy -
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)
Kiedy kompilujesz i wykonujesz program, daje to następujące dane wyjściowe -
Creating Line: {(1, 1), (4, 5)}
Length: 5
Niech Bindings
Powiązania let w definicji klasy umożliwiają definiowanie pól prywatnych i funkcji prywatnych dla klas F #.
type Greetings(name) as gr =
let data = name
do
gr.PrintMessage()
member this.PrintMessage() =
printf "Hello %s\n" data
let gtr = new Greetings("Zara")
Kiedy kompilujesz i wykonujesz program, daje to następujące dane wyjściowe -
Hello Zara
Zwróć uwagę na użycie własnego identyfikatora gr dla klasy Greetings .