Aracılığıyla paylaş


Kurucular (F#)

Bu konuda nasıl tanımlamak ve oluşturmak ve sınıf ve yapısını nesnelerinin başlatılması için Kurucular açıklanmaktadır.

Sınıf nesnelerinin yapım

Kurucular nesne sınıfı türü vardır. Kurucular iki türü vardır. Parametreleri yalnızca Tür adından sonra parantez içinde görünür, birincil yapıcı biridir. Diğer, isteğe bağlı ek Kurucular kullanarak belirttiğiniz new anahtar sözcüğü. Böyle bir ek Kurucular birincil kurucusunu çağırmalıdır.

Birincil yapıcı içeren let ve do sınıf tanımının başında görünen bağlar. A let özel alanları ve yöntemleri sınıfın; bağlama bildirir bir do bağlama kodu yürütür. Hakkında daha fazla bilgi için let sınıf Kurucularını bağlarında bkz: Sınıflar (F#) bağlarında olanak sağlar. Hakkında daha fazla bilgi için do Kurucular bağlarında bkz: Sınıflar (F#) bağlarında yapın.

Aramak istediğiniz yapıcı birincil Oluşturucu veya ek bir yapıcı olmasına bakılmaksızın, nesneleri kullanarak oluşturabileceğiniz bir new deyimi, ya da isteğe bağlı olmadan new anahtar sözcüğü. Virgülle ayrılmış ve parantez içinde veya adlandırılmış bağımsız değişkenleri ve değerler parantez içinde kullanarak içine nesneleriniz Oluşturucu bağımsız değişkenleri, sırayla bağımsız değişkenleri listeleme tarafından birlikte başlatmak. Ayrıca özellikleri bir nesnede nesne oluşturma sırasında özellik adlarını kullanarak ayarlayabilirsiniz ve yalnızca kullandığınız gibi değerler atama Oluşturucu bağımsız değişkenleri adlandırılmış.

Aşağıdaki kod, bir kurucu ve nesneler oluşturmanın çeşitli yolları vardır bir sınıf göstermektedir.

// This class has a primary constructor that takes three arguments
// and an additional constructor that calls the primary constructor.
type MyClass(x0, y0, z0) =
    let mutable x = x0
    let mutable y = y0
    let mutable z = z0
    do
        printfn "Initialized object that has coordinates (%d, %d, %d)" x y z
    member this.X with get() = x and set(value) = x <- value
    member this.Y with get() = y and set(value) = y <- value
    member this.Z with get() = z and set(value) = z <- value
    new() = MyClass(0, 0, 0)

// Create by using the new keyword.
let myObject1 = new MyClass(1, 2, 3)
// Create without using the new keyword.
let myObject2 = MyClass(4, 5, 6)
// Create by using named arguments.
let myObject3 = MyClass(x0 = 7, y0 = 8, z0 = 9)
// Create by using the additional constructor.
let myObject4 = MyClass()

Çıktı aşağıdaki gibidir.

Initialized object that has coordinates (1, 2, 3)
Initialized object that has coordinates (4, 5, 6)
Initialized object that has coordinates (7, 8, 9)
Initialized object that has coordinates (0, 0, 0)

İnşaat yapıları

Yapıları sınıflarının tüm kuralları izleyin. Bu nedenle, birincil bir oluşturucuya sahip olabilir ve kullanarak ek Kurucular sağlayabilir new. Ancak, yapılar ve sınıflar arasındaki tek önemli fark bulunmaktadır: yapıları bile birincil bir kurucu tanımlı bir varsayılan kurucu (diğer bir deyişle, bir bağımsız değişken olmadan) olabilir. Varsayılan Oluşturucu, genellikle sıfır veya bunun eşdeğeri türü için varsayılan değer tüm alanları başlatır. Varsayılan oluşturucuya sahip çakışmayacağından emin yapıları için tanımladığınız Kurucular en az bir bağımsız değişken olmalıdır.

Ayrıca, yapıları kullanılarak oluşturulan alanları genellikle sahip val anahtar sözcüðünü; sınıflar, bu alanlar da sahip olabilirsiniz. Yapı ve alanları kullanılarak tanımlanmış olan sınıfları val anahtar sözcüğünü de başlatıldı ek kurucuya kayıt ifadeleri kullanarak aşağıdaki kodda gösterildiği gibi.

type MyStruct =
    struct
       val X : int
       val Y : int
       val Z : int
       new(x, y, z) = { X = x; Y = y; Z = z }
    end

let myStructure1 = new MyStruct(1, 2, 3) 

Daha fazla bilgi için bkz. Açık alanlar: Val anahtar sözcüğü (F#).

Yan etkileri kurucuya yürütme

Birincil bir sınıf kurucusunda kod yürütebilir bir do bağlama. Ancak, yaşarsam ne ek kurucusu kodu olmadan yürütülecek bir do bağlama? Bunu yapmak için kullandığınız then anahtar sözcüğü.

 // Executing side effects in the primary constructor and
// additional constructors.
type Person(nameIn : string, idIn : int) =
    let mutable name = nameIn
    let mutable id = idIn
    do printfn "Created a person object."
    member this.Name with get() = name and set(v) = name <- v
    member this.ID with get() = id and set(v) = id <- v
    new() = 
        Person("Invalid Name", -1)
        then
            printfn "Created an invalid person object."

let person1 = new Person("Humberto Acevedo", 123458734)
let person2 = new Person()

Birincil yapıcısının yan etkileri hala yürütün. Bu nedenle, çıktı aşağıdaki gibi yapılır.

Created a person object.
Created a person object.
Created an invalid person object.

Kendini Kurucular tanımlayıcıları

Diğer üyelerine tanımında her üye, geçerli nesneye ilişkin bir ad verin. Kullanarak sınıf tanımının ilk satırda kendini tanımlayıcı koyabilirsiniz as yapıcı parametreleri hemen anahtar sözcüğü. Aşağıdaki örnekte, bu sözdizimi gösterilmektedir.

type MyClass1(x) as this =
    // This use of the self identifier produces a warning - avoid.
    let x1 = this.X
    // This use of the self identifier is acceptable.
    do printfn "Initializing object with X =%d" this.X
    member this.X = x

Ek kurucuya de kendini bir tanımlayıcı yerleştirerek tanımlayabilirsiniz as hemen sonra yapıcı parametreleri yan tümcesi. Aşağıdaki örnekte, bu sözdizimi gösterilmektedir.

type MyClass2(x : int) =
    member this.X = x
    new() as this = MyClass2(0) then printfn "Initializing with X = %d" this.X

Nesneyi tam olarak tanımlanan önce kullanmaya çalıştığınızda sorunlara neden olabilir. Bu nedenle, kendini tanımlayıcısı kullanır, derleyici uyarı yayma ve nesne başlatılmadan önce bir nesne üyeleri erişilemeyen emin olmak için ek denetimler eklemek neden olabilir. Yalnızca kendini tanımlayıcısını kullanmalısınız do bağları birincil yapıcısının ya da sonra then ek Kurucular bir anahtar sözcük.

Kendini tanımlayıcı adı olması gerekmez this. Bu geçerli bir tanımlayıcı olabilir.

Başlatma özellikleri için değerleri atama

Değerleri başlatma kodu, bir sınıf nesnesi özelliklerini formun atamalar listesini ekleyerek atayabileceğiniz property = value için bir kurucu bağımsız değişken listesine. Bu, aşağıdaki kod örneğinde gösterilmiştir.

 type Account() =
    let mutable balance = 0.0
    let mutable number = 0
    let mutable firstName = ""
    let mutable lastName = ""
    member this.AccountNumber
       with get() = number
       and set(value) = number <- value
    member this.FirstName
       with get() = firstName
       and set(value) = firstName <- value
    member this.LastName
       with get() = lastName
       and set(value) = lastName <- value
    member this.Balance
       with get() = balance
       and set(value) = balance <- value
    member this.Deposit(amount: float) = this.Balance <- this.Balance + amount
    member this.Withdraw(amount: float) = this.Balance <- this.Balance - amount


let account1 = new Account(AccountNumber=8782108, 
                           FirstName="Darren", LastName="Parker",
                           Balance=1543.33)

Önceki kod aşağıdaki sürümü sıradan değişkenler, isteğe bağlı bağımsız değişkenler ve özellik ayarları bir yapıcı çağrısında birleşimi gösterilmektedir.

type Account(accountNumber : int, ?first: string, ?last: string, ?bal : float) =
   let mutable balance = defaultArg bal 0.0
   let mutable number = accountNumber
   let mutable firstName = defaultArg first ""
   let mutable lastName = defaultArg last ""
   member this.AccountNumber
      with get() = number
      and set(value) = number <- value
   member this.FirstName
      with get() = firstName
      and set(value) = firstName <- value
   member this.LastName
      with get() = lastName
      and set(value) = lastName <- value
   member this.Balance
      with get() = balance
      and set(value) = balance <- value
   member this.Deposit(amount: float) = this.Balance <- this.Balance + amount
   member this.Withdraw(amount: float) = this.Balance <- this.Balance - amount


let account1 = new Account(8782108, bal = 543.33,
                          FirstName="Raman", LastName="Iyer")

Statik Kurucular veya tür Kurucular

Statik nesneler oluşturma kodunu belirterek ek olarak let ve do bağları yazılmış türü varsayılan başlatma türü düzeyinde gerçekleştirmek için kullanılmadan önce yürütme sınıf türleri içinde. Daha fazla bilgi için, bkz. Sınıflar (F#) bağlarında olanak sağlar ve Sınıflar (F#) bağlarında yapın.

Ayrıca bkz.

Diğer Kaynaklar

Üyeler (F#)