Metody (F#)

A metody je funkce, která je přidružena k typu.V objektově orientovaném programování metod vystavit a implementovat chování objektů a typů a funkcí.

// 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

Poznámky

V syntaxi předchozí uvidíte různé formy deklarace metody a definice.V delší subjekty metodu konec řádku následuje rovnítko (=) a odsazena metoda celé tělo.

Atributy lze použít pro všechny deklarace metody.Tyto předcházet syntaxe definice metody a obvykle uveden na samostatném řádku.Další informace naleznete v tématu Atributy (F#).

Metody mohou být označeny inline.Informace o inline, viz Vložené funkce (F#).

Jiné než vložené metody mohou být rekurzivně používané v rámci typu; není nutné explicitně použít rec klíčové slovo.

Metody instance

Metody instance jsou deklarovány pomocí member klíčové slovo a self-identifier, následuje tečka (.) a název metody a parametrů.Stejně jako v případě pro let vazby, parameter-list může být vzorek.Obvykle je uzavřít způsob, který se zobrazí v závorkách ve formuláři n-tice je způsob metody parametry v F# když jsou vytvořeny v jiných.NET Framework jazyky.Je také běžné formuláře curried (parametry oddělené mezerami) a jsou také podporovány další vzorky.

Následující příklad ukazuje definici a použití instance nejsou abstraktní metody.

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

V rámci metody instance pomocí self identifikátor definována pomocí vazby umožňují přístup pole.Při přístupu k ostatních členů a vlastnosti, použijte vlastní identifikátor.

Statické metody

Klíčové slovo static se používá k určení, že metodu nelze volat bez instanci a není přidružen k instanci objektu.Jinak metody jsou metody instance.

V další části Příklad polí s let klíčové slovo, členové vlastnost deklarována s member klíčové slovo a statická metoda deklarována s static klíčové slovo.

Následující příklad ukazuje definici a použití statické metody.Předpokládejme, že tyto definice metody v SomeType třídy v předchozí části.

static member SomeStaticMethod(a, b, c) =
   (a + b + c)

static member SomeOtherStaticMethod(a, b, c) =
   SomeType.SomeStaticMethod(a, b, c) * 100

Abstraktní a virtuální metody.

Klíčové slovo abstract označuje, že metoda má virtuální odeslání patice a máte definici třídy.A patice virtuální odeslání je volání typu objektově orientované položku ve vnitřně udržované tabulce funkce vyhledat virtuální funkce používaný v době spuštění.Virtuální odeslání mechanismus je mechanismus, který implementuje polymorfismus, důležitým aspektem objektově orientované programování.Třída, která má alespoň jeden abstraktní metodu bez definice je abstraktní třída, což znamená vytvořit žádné instance dané třídy.Další informace o abstraktní třídy, viz Abstraktní třídy (F#).

Abstraktní metoda prohlášení neobsahují tělo metody.Místo toho názvu metody následované dvojtečkou (:) a podpis typu metody.Podpis typu metody je stejný jako zobrazené pomocí technologie IntelliSense, která umístěte ukazatel myši nad název metody v aplikaci Visual Studio Editor kódu, s výjimkou bez názvy parametrů.Typ podpisy jsou také zobrazeny interpret, fsi.exe, když interaktivně pracujete.Podpis typu metody je tvořen výpis typy parametrů, následovaný návratový typ symboly příslušný oddělovač.Curried parametry jsou odděleny - > a n-tice parametry jsou odděleny *.Vrácená hodnota je vždy odděleny od argumenty podle-> symbol.Závorky lze seskupit složité parametry, například pokud je typ funkce parametru, nebo určete, kdy n-tice je nakládáno jako jediný parametr, nikoli jako dva parametry.

Můžete také předat abstraktní metody výchozí definice Přidání definice třídy a použitím default klíčové slovo, jak je uvedeno v bloku syntaxe v tomto tématu.Je ekvivalentní virtuální metody v jiných abstraktní metody se definicí ve stejné třídě.NET Framework jazyky.Zda existuje definice abstract klíčové slovo vytvoří novou patici odeslání v tabulce funkce virtuální třídy.

Bez ohledu na to, zda základní třída implementuje jeho abstraktní metody může poskytnout odvozené třídy implementace abstraktní metody.Chcete-li implementovat abstraktní metoda odvozené třídy, definovat metodu, která má stejné jméno a podpis v odvozené třídě, s výjimkou použití override nebo default klíčové slovo a poskytnout tělo metody.Klíčová slova override a default rozumí stejnou věc.Použití override Pokud přepíše nové metody základní třídy provádění; použít default při vytváření implementace ve stejné třídě jako původní abstraktní prohlášení.Nepoužívejte abstract klíčové slovo na způsob, který implementuje metody, která byla prohlášena za abstraktní základní třídy.

Následující příklad ukazuje abstraktní metoda Rotate , která má výchozí implementace ekvivalent.NET Framework virtuální metody.

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

Následující příklad ukazuje odvozené třídy, která potlačí metody základní třídy.V případě vyřazení změní chování tak, že metoda neprovede žádnou akci.

type Circle(radius : float) =
    inherit Ellipse(radius, radius, 0.0)
     // Circles are invariant to rotation, so do nothing.
    override this.Rotate(_) = ()

Přetížené metody

Přetížené metody jsou metody, které mají stejné názvy v daného typu, ale mají různé argumenty.F# volitelné argumenty jsou obvykle použity místo přetížené metody.Přetížené metody jsou však povoleny v jazyce, za předpokladu, že jsou argumenty v n-tice formulář, formulář není curried.

Příklad: Vlastnosti a metody

Následující příklad obsahuje typ, který má příklady polí, soukromé funkce, vlastnosti a statické metody.

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

Viz také

Další zdroje

Členy (F#)