Devralma
Devralma, nesne odaklı programlamada "is-a" ilişkisini veya alt stili modellemek için kullanılır.
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.Object
devralır.
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 ö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
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")
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.
.NET geri bildirimi
.NET, açık kaynak bir projedir. Geri bildirim sağlamak için bir bağlantı seçin: