Devralma

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

Devralma İlişkilerini Belirtme

Devralma ilişkilerini bir sınıf bildiriminde anahtar inherit sözcüğünü kullanarak belirtirsiniz. Temel bozulma biçimi 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ü kullanarak bir temel sınıf inherit belirtmezseniz, sınıf örtülü olarak 'den devralınır. System.Object

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 doğrudan üyeleri gibi türetilmiş sınıfın kullanıcıları tarafından 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 kendine tanımlayıcı gibi kullanılır.

Sanal Yöntemler ve Geçersiz Kılmalar

Sanal yöntemler (ve özellikler), F# dilinde diğer .NET dillerinde olduğu gibi farklı çalışır. Yeni bir sanal üyeyi bildirilen anahtar sözcüğünü abstract kullanırsiniz. Bunu, bu yöntem için varsayılan bir uygulama s sağlamadan bağımsız olarak yaparsiniz. Bu nedenle, bir temel sınıftaki sanal yöntemin tam tanımı şu düzeni izler:

abstract member [method-name] : [type]

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

Türetilmiş bir sınıfta ise bu sanal yöntemin geçersiz kılınma şekli şu desene uyar:

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

Temel sınıfta varsayılan uygulama atlarsanız, temel sınıf soyut bir sınıf olur.

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

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şturucusu türetilmiş sınıfta çağrılmalıdır. Temel sınıf oluşturucusu için bağımsız değişkenler yan tümcesinde bağımsız değişken listesinde inherit görünür. Kullanılan değerler, türetilmiş sınıf oluşturucusu için sağlanan bağımsız değişkenlerden belirlenmalıdır.

Aşağıdaki kod, türetilmiş sınıfın inherit yan tümcesinde temel sınıf oluşturucusu çağıran bir temel sınıf ve türetilmiş bir 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 durumunda aşağıdaki kod kullanılabilir. Türetilmiş sınıf oluşturucularının ilk satırı yan tümcesidir ve alanlar anahtar sözcüğüyle inherit bildirilen açık alanlar olarak val görünür. Daha fazla bilgi için bkz. Açık Alanlar: Anahtar val Sözcüğü.

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")

Devralmanın 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 bulundurabilirsiniz. Aşağıdaki örnek, yeni türetilmiş bir tür oluşturmaya alternatif olarak nesne ifadesinin kullanımını gösterir:

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ımlı bir birliktelik kullanmayı göz önünde bulundurabilirsiniz. Ayrımlı union'lar, ortak bir genel türü ortak olan farklı nesnelerin farklı davranışlarını da modellemektedir. Ayrımlı tek bir birliktelik, genellikle birbirinin küçük varyasyonları olan bir dizi türetilmiş sınıfa olan ihtiyacı ortadan kaldırabilirsiniz. Ayrımlı union'lar hakkında bilgi için bkz. Ayrımlı Unions.

Ayrıca bkz.