Aracılığıyla paylaş


Yöntemleri (F#)

A yöntemi bir türü ile ilişkili olan bir işlevdir. Nesne yönelimli programlamada yöntemleri açığa çıkaran ve işlevsellik ve nesneler ve türlerle davranışını uygulamak için kullanılır.

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

Notlar

Önceki sözdiziminde yöntem bildirimleri ve tanımları çeşitli formlar görebilirsiniz. Uzun yöntem gövdeleri, satır sonu eşittir işareti (=) izleyen ve tüm yöntem gövdesi girintili olur.

Öznitelikler herhangi bir yöntem bildiriminde uygulanabilir. Bunlar, yöntem tanımının sözdizimi koyun ve genellikle ayrı bir satırda listelenir. Daha fazla bilgi için bkz. Öznitelikler (F#).

Yöntemleri işaretlenir inline. Hakkında bilgi için inline, bkz: Satır içi işlevleri (F#).

Tür içinde kullanılan yinelemeli olmayan satır içi yöntemleri olabilir; açıkça kullanmaya gerek yoktur rec anahtar sözcüğü.

Örnek yöntemleri

Örnek yöntemleri ile bildirilen member anahtar sözcüğünü ve bir self-identifierve ardından bir nokta (.) ve method name ve parametreleri. İçin olduğu gibi let bağları, parameter-list bir deseni olabilir. Diğer oluşturuldukları sırada genellikle, yöntem parametreleri parantez içinde yöntemlerin bir kayıt düzeni forma görünür F# alın.net Framework diller. Ancak, curried form (boşluklarla ayrılmış parametreleri) de yaygındır ve diðer desenleri de desteklenir.

Aşağıdaki örnekte, tanımı ve soyut olmayan örnek yöntemi gösterilmektedir.

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

Örnek yöntemleri içinde kendini tanımlayıcı organizayonunuzdaki bağlantılarını kullanarak tanımlanan erişim alanları için kullanmayın. Diğer üyeler ve özelliklerine erişirken kendini tanımlayıcısını kullanın.

Statik yöntemler

Anahtar sözcük static bir örneği bir yöntem çağrılabilir belirtmek için kullanılır ve bir nesne örneği ile ilişkili değil. Aksi halde, örnek yöntemleri yöntemlerdir.

Sonraki bölümde yer alan örnek alanlar ile bildirilen gösterir let özelliği üyeleri anahtar, bildirilen ile member anahtar sözcüğünü ve bir durağan yöntem ile bildirilen static anahtar sözcüğü.

Aşağıdaki örnek tanım ve statik yöntemler kullanımını göstermektedir. Bu yöntem tanımlarını içinde olduğunu SomeType önceki bölümde sınıfı.

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

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

Soyut ve sanal yöntemleri

Anahtar sözcük abstract bir yöntemi sanal gönderme yuvası ve bir tanım sınıfında olmayabilir gösterir. A sanal gönderme yuva sanal işlev arayın için çalışma zamanında kullanılan dahili olarak tutulan bir tablosuyla işlevlerin girişte çağıran nesne yönelimli bir yazıyla olur. Sanal gönderme mekanizması uygular mekanizmadır çok biçimlilik, nesne tabanlı programlama önemli bir özelliğidir. Bir tanım olmadan en az bir Özet yöntem olan bir sınıf olduğu bir soyut bir sınıf, başka bir deyişle, bu sınıfın örnekleri oluşturulabilir. Soyut sınıflar hakkında daha fazla bilgi için bkz: Soyut sınıflar (F#).

Özet yöntem bildirimleri bir yöntem gövdesine eklemeyin. Bunun yerine, yöntemin adı üste izler (:) ve yöntemin tür imzası. Yöntemin tür imzası, fare işaretçisini üzerinde Visual Studio Kod Düzenleyicisi'nde, bir yöntem adı dışında parametre adları duraklattığınızda, IntelliSense tarafından gösterilen aynıdır. Etkileşimli olarak çalışırken tür imzaları de fsi.exe, yorumlayıcı tarafından görüntülenir. Yöntemin tür imzası uygun ayırıcıyı sembollerle dönüş türü arkasından parametrelerinin türleri dışında liste olarak biçimlendirilmiş. Curried parametreleri ayrılır - > Kayıt düzeni parametreleri ayrılır ve *. Bağımsız değişkenler gelen dönüş değeri her zaman ayrılır > simge. Parantez içinde bir işlev türü bir parametre olduğu zamanki gibi karmaşık parametreler, Grup veya ne zaman kayıt düzeni iki parametre yerine tek bir parametre olarak değerlendirildiğini göstermek için kullanılabilir.

Ayrıca Soyut yöntemler varsayılan tanımları için sınıf tanımını ekleyerek ve kullanma vereceğiniz default bu konudaki sözdizimi bloğunda gösterildiği gibi anahtar sözcüğü. Aynı sınıfta bir tanımını içeren bir soyut yöntemi, diğer sanal bir yöntem eşdeğerdir.net Framework diller. Olmasa da bir tanımı var, abstract anahtar sözcüğünü sınıfı için sanal işlev tablosunda yeni bir gönderme yuva oluşturur.

Türetilmiş Sınıflar olup bir temel sınıf soyut yöntemlerini uygulayan ne olursa olsun, soyut yöntemler uygulamaları sağlayabilir. Türetilmiş bir sınıf soyut bir yöntemi uygulamak için kullanım dışında türetilmiş bir sınıf aynı ada ve imzaya sahip bir yöntem tanımlamak override veya default anahtar sözcüğü ve yöntem gövdesi sağlar. Anahtar sözcükler override ve default aynı şeyi ifade ederler. Use override bir temel sınıf uygulaması; yeni bir yöntemi geçersiz kılar, kullanmak default özgün Özet bildirimi ile aynı sınıfta uygulaması oluşturduğunuzda. Kullanmak istemediğiniz abstract yer alan base sınıfı soyut bildirilmiş metot yöntemi anahtar sözcüğü.

Aşağıdaki örnekte, bir Özet yöntem gösterilmektedir Rotate bir varsayýlan uygulama eşdeğeri olan bir.net Framework sanal yöntem.

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

Aşağıdaki örnekte, bir temel sınıf yöntemi geçersiz kılıyor türetilmiş bir sınıf gösterilmektedir. Bu durumda geçersiz kılma davranışını değiştirir, böylece yöntemi bir şey yapmaz.

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

Aşırı yüklenmiş yöntemler

Aşırı yüklenmiş yöntemler, belirli bir türde aynı adlara sahip, ancak farklı bağımsız olan yöntemlerdir. F# isteğe bağlı bağımsız değişkenler genellikle aşırı yüklenmiş yöntemler yerine kullanılır. Ancak, kayıt düzeni formda değil curried formu bağımsız olması koşuluyla aşırı yüklenmiş yöntemler dilde izin verilir.

Örnek: Özellikleri ve yöntemleri

Aşağıdaki örnek alanları, özel işlevler, özellikler ve durağan bir yöntem örnekleri olan bir tür içerir.

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

Ayrıca bkz.

Diğer Kaynaklar

Üyeler (F#)