Udostępnij za pośrednictwem


Typ rozszerzenia (F#)

Rozszerzenia typu pozwalają na dodawanie nowych członków do typu obiektu wcześniej zdefiniowanych.

// Intrinsic extension.
type typename with
   member self-identifier.member-name =
      body
   ...
   [ end ]

// Optional extension.
type typename with
   member self-identifier.member-name =
      body
   ...
   [ end ]

Uwagi

Istnieją dwie formy rozszerzenia typu, które zostały nieznacznie różni i zachowanie.Wewnętrzne rozszerzenie jest rozszerzeniem, które pojawia się w ten sam obszar nazw lub moduł, w tym samym pliku źródłowego i w tym samym zestawie (biblioteki DLL lub plik wykonywalny) jako typ zostanie przedłużone.Opcjonalne rozszerzenie jest rozszerzeniem, które znajduje się poza oryginalnego moduł, obszar nazw lub montaż typu zostanie przedłużone.Wewnętrzne rozszerzeń pojawiają się na typ typu zostanie zbadane przez odbicie, ale nie opcjonalne rozszerzenia.Opcjonalne rozszerzenia musi być w modułach i są jedynie w zakresie, moduł, który zawiera rozszerzenie jest otwarty.

W poprzednich składni typename reprezentuje typ, który zostanie rozszerzone.Dowolnego typu, który można uzyskać dostęp, może zostać przedłużony, ale nazwa typu musi być nazwą rzeczywistego typu nie skrót typu.Wielu członków można zdefiniować jeden typ rozszerzenia.self-identifier Reprezentuje wystąpienie obiektu wywołany, tak jak w zwykłym członków.

end Słowo kluczowe jest opcjonalne w składni lekkie.

Elementy członkowskie zdefiniowane w rozszerzeniach typu może być używany tylko innych członków na typ klasy.Podobnie jak inni członkowie mogą być statyczna lub instancji członków.Metody te są również znany jako metody rozszerzenie; właściwości są znane jako Właściwości rozszerzenia, i tak dalej.Opcjonalne rozszerzenie członków są kompilowane na elementy statyczne, dla których wystąpienie obiektu jest przekazywana niejawnie jako pierwszy parametr.Jednak działają one tak, jakby były one wystąpienie członków lub statyczne zgodnie z tego, jak są one zgłoszone.Członkowie rozszerzenie niejawne są uwzględnione jako elementy członkowskie typu i może być używany bez ograniczeń.

Rozszerzenie metody nie mogą być metodami virtual lub abstract.Mogą one przeciążenie innych metod o tej samej nazwie, ale kompilator daje preferencje metod-rozszerzenie w przypadku wywołanie niejednoznaczne.

Jeśli wiele rozszerzeń wewnętrzne typu istnieje dla jednego typu, wszyscy członkowie muszą być unikatowe.Dla rozszerzenia typu opcjonalne członków w różnych typów rozszerzeń do tego samego typu można tych samych nazwach.Dwuznaczność błędy występują tylko wtedy, gdy kod klienta otwiera dwa różne zakresy definiujące tej samej nazwy składników.

W poniższym przykładzie typ w module ma rozszerzenie typu wewnętrzne.Kod klienta poza moduł rozszerzenie typu pojawi się regularne członka typu we wszystkich aspektach.

module MyModule1 =

    // Define a type.
    type MyClass() =
      member this.F() = 100

    // Define type extension.
    type MyClass with
       member this.G() = 200

module MyModule2 =
   let function1 (obj1: MyModule1.MyClass) =
      // Call an ordinary method.
      printfn "%d" (obj1.F())
      // Call the extension method.
      printfn "%d" (obj1.G())

Do oddzielania definicji typu na sekcje, można użyć rozszerzenia typu wewnętrzne.Może to być przydatne w zarządzaniu definicje duże czcionki, na przykład zachować generowanych przez kompilator kodu i kodu autoryzowanego oddzielnie lub zgrupować kod utworzony przez różne osoby lub związanych z różnych funkcji.

W poniższym przykładzie rozszerza rozszerzenie typu opcjonalne System.Int32 typu przy użyciu metody rozszerzenie FromString wywołania funkcji członka statycznego Parse.testFromString Metoda wykaże, że nowy członek nazywa się podobnie jak każdy członek instancji.

// Define a new member method FromString on the type Int32.
type System.Int32 with
    member this.FromString( s : string ) =
       System.Int32.Parse(s)

let testFromString str =  
    let mutable i = 0
    // Use the extension method.
    i <- i.FromString(str)
    printfn "%d" i

testFromString "500"

Nowy członek instancji pojawią się podobnie jak inne metody z Int32 typu w technologii IntelliSense, ale tylko wtedy, gdy moduł, który zawiera rozszerzenie zakresu jest otwarte lub w inny sposób.

Zobacz też

Inne zasoby

F# Language Reference

Członkowie (F#)