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 .