Metody (F#)
A Metoda jest funkcją, która jest skojarzona z typem.W programowaniu obiektowym metody służą do narazić i wdrażania funkcji i zachowanie obiektów i typów.
// Instance method definition.
[ attributes ]
member [inline] self-identifier.method-name parameter-list [ : return-type ]=
method-body
// Static method definition.
[ attributes ]
static member [inline] method-name parameter-list [ : return-type ]=
method-body
// Abstract method declaration or virtual dispatch slot.
[ attributes ]
abstract member self-identifier.method-name : type-signature
// Virtual method declaration and default implementation.
[ attributes ]
abstract member [inline] self-identifier.method-name : type-signature
[ attributes ]
default member [inline] self-identifier.method-name parameter-list[ : return-type ] =
method-body
// Override of inherited virtual method.
[ attributes ]
override member [inline] self-identifier.method-name parameter-list [ : return-type ]=
method-body
Uwagi
W poprzednich składni zobacz temat różnych form deklaracje metod i definicji.W organach metoda dłuższy podział wiersza, następuje znak równości (=) i treści całej metody są wcięte.
Atrybuty mogą być stosowane do każdej deklaracji metody.One poprzedzać Składnia definicji metody i zazwyczaj są wyświetlane w osobnym wierszu.Aby uzyskać więcej informacji, zobacz Atrybuty (F#).
Metody może być oznaczony inline.Aby uzyskać informacje o inline, zobacz Funkcje śródwierszowe (F#).
Brak wbudowanej metody może być używany rekurencyjnie w ramach typu; istnieje potrzeba jawne używanie rec słowa kluczowego.
Metody instancji
Metody instancji są zgłoszone jako member słowa kluczowego i self-identifier, a następnie kropka (.) i nazwy metody i parametrów.Jak w przypadku let wiązania, parameter-list może być wzorek.Zazwyczaj należy ująć metodę, której parametry w nawiasach w postaci spoiny jest metody sposób pojawiają się w F# tworzenia w innych.NET Framework języków.Formularz curried (parametry oddzielone spacjami) jest również wspólne i inne wzorce są także obsługiwane.
Poniższy przykład ilustruje definicji i korzystania z metody instancji nieabstrakcyjna.
type SomeType(factor0: int) =
let factor = factor0
member this.SomeMethod(a, b, c) =
(a + b + c) * factor
member this.SomeOtherMethod(a, b, c) =
this.SomeMethod(a, b, c) * factor
Wewnątrz metody instancji nie należy używać self identyfikator do pól programu access zdefiniowane przy użyciu let wiązania.Za pomocą identyfikatora self podczas uzyskiwania dostępu do innych członków i właściwości.
Metody statyczne
Słowo kluczowe static jest używana do określenia, że metoda może być wywołana bez wystąpienia i nie jest skojarzony z instancji klasy object.W przeciwnym razie przedstawiono metody instancji.
W przykładzie w następnej sekcji przedstawiono pola zadeklarowana z let słowa kluczowego, członkowie właściwość zadeklarowana ze member słowa kluczowego i statycznej metody zadeklarowane z static słowa kluczowego.
Poniższy przykład ilustruje definicji i korzystania ze statycznej metody.Zakłada się, że definicje te metody są w SomeType klasy w poprzedniej sekcji.
static member SomeStaticMethod(a, b, c) =
(a + b + c)
static member SomeOtherStaticMethod(a, b, c) =
SomeType.SomeStaticMethod(a, b, c) * 100
Metody abstrakcyjne i wirtualnych
Słowo kluczowe abstract wskazuje, że metoda ma gniazdo wirtualnego wysyłki i może nie mieć definicji klasy.A wirtualnych wysyłki gniazdo jest wpis w tabeli obsługiwanej wewnętrznie funkcji używany w czasie wykonywania odszukać funkcję wirtualną wywołuje typu object-oriented.Mechanizm wirtualnego wysyłki jest mechanizm, który implementuje polimorfizm, ważną cechą Programowanie zorientowane obiektowo.Klasa, która ma co najmniej jednej metody abstrakcyjne bez definicji jest Klasa abstrakcyjna, co oznacza, że nie można tworzyć jego wystąpień tej klasy.Aby uzyskać więcej informacji na temat klasy abstrakcyjne, zobacz Klasy abstrakcyjne (F#).
Metoda abstrakcyjna deklaracje nie zawierają treść metody.Zamiast tego, nazwa metody następuje dwukropek (:) i podpis typu metody.Podpis typu metody jest taka sama, jak pokazano przez technologię IntelliSense, po zatrzymaniu wskaźnika myszy nad nazwą metody w Visual Studio Edytor kodu, z wyjątkiem bez nazwy parametrów.Typ podpisy są również wyświetlane przez interpreter, fsi.exe, podczas pracy w interakcyjnie.Podpis typu metody jest utworzona przez aukcji out typy parametrów, a następnie zwracany typ, z symbolami odpowiedni separator.Parametry curried są oddzielone - > a krotka parametry są oddzielone *.Zwracana wartość zawsze jest oddzielona od argumentów przez - > symbol.Nawiasy można grupa złożona parametry, takie jak parametr typu funkcji lub wskazać, kiedy krotki jest traktowany jako pojedynczy parametr, a nie dwa parametry.
Definicje domyślnej metody abstrakcyjne można również nadać przez dodanie definicji klasy i za pomocą default słowa kluczowego, jak pokazano w bloku składni w tym temacie.Metoda abstrakcyjna, zawierający definicję w tej samej klasie jest równoważna metoda wirtualna w innych.NET Framework języków.Czy istnieje definicję abstract słowa kluczowego tworzy nowe gniazdo wysyłki w tabeli funkcję wirtualną dla tej klasy.
Niezależnie od tego, czy klasa podstawowa implementuje jego metody abstrakcyjne klas pochodnych może zapewnić implementacji metody abstrakcyjne.Aby zaimplementować metoda abstrakcyjna w klasie pochodnej, należy zdefiniować metodę, która ma taką samą nazwę i podpis w klasie pochodnej, z wyjątkiem wykorzystania override lub default słowa kluczowego i podaj treść metody.Słowa kluczowe override i default oznacza dokładnie to samo.Użyj override , jeśli nowa metoda zastępuje implementacji klasy podstawowej; Użyj default podczas tworzenia implementacji w tej samej klasy co początkowego zgłoszenia abstrakcyjny.Nie należy używać abstract słowa kluczowego na metody, która implementuje metody, który został zadeklarowany jako abstrakcyjny w klasie podstawowej.
Poniższy przykład ilustruje metoda abstrakcyjna Rotate który została domyślna implementacja odpowiednik.NET Framework metoda wirtualna.
type Ellipse(a0 : float, b0 : float, theta0 : float) =
let mutable axis1 = a0
let mutable axis2 = b0
let mutable rotAngle = theta0
abstract member Rotate: float -> unit
default this.Rotate(delta : float) = rotAngle <- rotAngle + delta
Poniższy przykład ilustruje klasy pochodnej, która zastępuje metodę klasy podstawowej.W przypadku zastąpienia zmienia zachowanie, tak, że metoda nic nie robi.
type Circle(radius : float) =
inherit Ellipse(radius, radius, 0.0)
// Circles are invariant to rotation, so do nothing.
override this.Rotate(_) = ()
Metody przeciążane
Metody przeciążane są metody, które mają identyczne nazwy w danym typie, ale mają różne argumenty.F# opcjonalne argumenty są zwykle używane zamiast metody przeciążane.Metody przeciążane są jednak dozwolone w języku, pod warunkiem, że argumenty zostały podane w postaci spoiny, nie curried formularza.
Przykład: Właściwości i metody
Poniższy przykład zawiera typ, który zawiera przykłady pól, funkcje typu private, właściwości i metody statycznej.
type RectangleXY(x1 : float, y1: float, x2: float, y2: float) =
// Field definitions.
let height = y2 - y1
let width = x2 - x1
let area = height * width
// Private functions.
static let maxFloat (x: float) (y: float) =
if x >= y then x else y
static let minFloat (x: float) (y: float) =
if x <= y then x else y
// Properties.
// Here, "this" is used as the self identifier,
// but it can be any identifier.
member this.X1 = x1
member this.Y1 = y1
member this.X2 = x2
member this.Y2 = y2
// A static method.
static member intersection(rect1 : RectangleXY, rect2 : RectangleXY) =
let x1 = maxFloat rect1.X1 rect2.X1
let y1 = maxFloat rect1.Y1 rect2.Y1
let x2 = minFloat rect1.X2 rect2.X2
let y2 = minFloat rect1.Y2 rect2.Y2
let result : RectangleXY option =
if ( x2 > x1 && y2 > y1) then
Some (RectangleXY(x1, y1, x2, y2))
else
None
result
// Test code.
let testIntersection =
let r1 = RectangleXY(10.0, 10.0, 20.0, 20.0)
let r2 = RectangleXY(15.0, 15.0, 25.0, 25.0)
let r3 : RectangleXY option = RectangleXY.intersection(r1, r2)
match r3 with
| Some(r3) -> printfn "Intersection rectangle: %f %f %f %f" r3.X1 r3.Y1 r3.X2 r3.Y2
| None -> printfn "No intersection found."
testIntersection