Devralma

Devralma, nesne odaklı programlamada "is-a" ilişkisini veya alt stili modellemek için kullanılır.

Devralma İlişkilerini Belirtme

Devralma ilişkilerini sınıf bildiriminde anahtar sözcüğünü inherit kullanarak belirtirsiniz. Temel sağlam biçim aşağıdaki örnekte gösterilmiştir.

type MyDerived(...) =
    inherit MyBase(...)

Bir sınıfın en fazla bir doğrudan temel sınıfı olabilir. anahtar sözcüğünü inherit kullanarak bir temel sınıf belirtmezseniz, sınıfı örtük olarak öğesinden System.Objectdevralır.

Devralınmış Üyeler

Bir sınıf başka bir sınıftan devralıyorsa, temel sınıfın yöntemleri ve üyeleri türetilmiş sınıfın kullanıcıları, türetilmiş sınıfın doğrudan üyeleriymiş gibi kullanılabilir.

Tüm let bağlamaları ve oluşturucu parametreleri bir sınıfa özeldir ve bu nedenle türetilmiş sınıflardan erişilemez.

anahtar sözcüğü base türetilmiş sınıflarda kullanılabilir ve temel sınıf örneğine başvurur. Kendi tanımlayıcısı gibi kullanılır.

Sanal Yöntemler ve Geçersiz Kılmalar

Sanal yöntemler (ve özellikler), F# dilinde diğer .NET dillerine göre biraz farklı çalışır. Yeni bir sanal üye bildirmek için anahtar sözcüğünü abstract kullanırsınız. Bu yöntem için varsayılan bir uygulama sağlayıp sağlamadığınızdan bağımsız olarak bunu yaparsınız. Bu nedenle, temel sınıftaki bir sanal yöntemin tam tanımı şu deseni izler:

abstract member [method-name] : [type]

default [self-identifier].[method-name] [argument-list] = [method-body]

Ve türetilmiş bir sınıfta, bu sanal yöntemin geçersiz kılması şu deseni izler:

override [self-identifier].[method-name] [argument-list] = [method-body]

Temel sınıftaki varsayılan uygulamayı atlarsanız, temel sınıf soyut bir sınıf olur.

Aşağıdaki kod örneği, temel sınıfta yeni bir sanal yöntemin function1 bildirimini ve türetilmiş bir sınıfta geçersiz kılmayı gösterir.

type MyClassBase1() =
    let mutable z = 0
    abstract member function1: int -> int

    default u.function1(a: int) =
        z <- z + a
        z

type MyClassDerived1() =
    inherit MyClassBase1()
    override u.function1(a: int) = a + 1

Oluşturucular ve Devralma

Temel sınıfın oluşturucusunun türetilmiş sınıfta çağrılmalıdır. Temel sınıf oluşturucusunun bağımsız değişkenleri yan tümcesindeki bağımsız değişken listesinde inherit görünür. Kullanılan değerler türetilmiş sınıf oluşturucusunun sağladığı bağımsız değişkenlerden belirlenmelidir.

Aşağıdaki kod, türetilmiş sınıfın inherit yan tümcesindeki temel sınıf oluşturucuyu çağırdığı temel sınıfı ve türetilmiş sınıfı gösterir:

type MyClassBase2(x: int) =
    let mutable z = x * x

    do
        for i in 1..z do
            printf "%d " i


type MyClassDerived2(y: int) =
    inherit MyClassBase2(y * 2)

    do
        for i in 1..y do
            printf "%d " i

Birden çok oluşturucu söz konusu olduğunda aşağıdaki kod kullanılabilir. Türetilmiş sınıf oluşturucularının ilk satırı yan tümcedir inherit ve alanlar anahtar sözcüğüyle val bildirilen açık alanlar olarak görünür. Daha fazla bilgi için bkz . Açık Alanlar: Anahtar val Sözcük.

type BaseClass =
    val string1 : string
    new (str) = { string1 = str }
    new () = { string1 = "" }

type DerivedClass =
    inherit BaseClass

    val string2 : string
    new (str1, str2) = { inherit BaseClass(str1); string2 = str2 }
    new (str2) = { inherit BaseClass(); string2 = str2 }

let obj1 = DerivedClass("A", "B")
let obj2 = DerivedClass("A")

Devralma Alternatifleri

Bir türün küçük bir değişikliğinin gerekli olduğu durumlarda, devralmaya alternatif olarak bir nesne ifadesi kullanmayı göz önünde bulundurun. Aşağıdaki örnekte, yeni türetilmiş bir tür oluşturmaya alternatif olarak nesne ifadesinin kullanımı gösterilmektedir:

open System

let object1 =
    { new Object() with
        override this.ToString() = "This overrides object.ToString()" }

printfn "%s" (object1.ToString())

Nesne ifadeleri hakkında daha fazla bilgi için bkz . Nesne İfadeleri.

Nesne hiyerarşileri oluştururken devralma yerine ayrımcı bir birleşim kullanmayı göz önünde bulundurun. Ayrımcı birleşimler, ortak bir genel türü paylaşan farklı nesnelerin farklı davranışlarını da modelleyebilir. Tek bir ayrımcı birleşim, genellikle birbirinin küçük varyasyonları olan türetilmiş sınıflara duyulan ihtiyacı ortadan kaldırabilir. Ayrımcı birleşimler hakkında bilgi için bkz . Ayrımcı Birleşimler.

Ayrıca bkz.