Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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ınan Ü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.