Aracılığıyla paylaş


Kalıtım (F#)

Devralma "olduğunu-a" ilikisini modellemek için kullanılan veya, nesne yönelimli programlamada subtyping.

Kalıtım ilişkileri belirtme

Kalıtım ilişkileri kullanarak belirttiğiniz inherit bir sınıf bildirimi bir anahtar sözcük. Temel dizimi 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. Bir temel sınıf kullanarak belirttiğiniz değil, inherit , sınıf örtülü olarak inherits anahtar sözcüğünü dan Object.

Devralınan üyeleri

Bir sınıfın başka bir sınıftan miras, yöntemleri ve temel sınıf üyeleri doğrudan türetilmiş bir sınıf üyesi yokmuş gibi türetilmiş sınıf kullanıcılar için kullanılabilir.

Herhangi bir bağlama let ve yapıcı parametreleri bir sınıfa özel ve, bu nedenle, türetilmiş sınıflardan erişilemiyor.

Anahtar sözcük base türetilmiş sınıflarda kullanılabilir ve temel sınıf örneğine başvurur. Bu gibi self-identifier kullanılır.

Sanal yöntemleri hem de geçersiz kılmaları

Sanal yöntemleri (ve özellikleri) biraz farklı F# diğer karşılaştırıldığında çalışır.net dilleri. Yeni bir sanal üye bildirmek için kullandığınız abstract anahtar sözcüğü. Bunun için bu yöntem için bir varsayýlan uygulama sağlamak mı olsun. Bu nedenle bu desen tam bir sanal yöntem bir taban sınıftaki tanımı aşağıdaki gibidir:

abstract member method-name : type

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

Ve türetilmiş bir sınıfta geçersiz kılma bu sanal bir yöntem, bu düzeni izler:

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

Temel sınıf varsayılan uygulamasında atlarsanız, temel sınıf soyut bir sınıf haline gelir.

Aşağıdaki kod örneği, yeni bir sanal yöntem bildirimi göstermektedir function1 temel bir sınıf ve türetilmiş bir sınıfta geçersiz kılmak nasıl.

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 kurucusunu, türetilmiş sınıf içinde çağrılmalıdır. Temel sınıf kurucusunu bağımsız değişken listesinde görünür inherit yan tümcesi. Türetilmiş sınıf kurucusu tarafından sağlanan bağımsız değişkenler tarafından kullanılan değerleri belirlenmelidir.

Aşağıdaki kod, burada temel sınıf kurucusunu devral yan tümcesinde türetilmiş bir sınıf çağırır temel bir 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 Kurucular olması durumunda, aşağıdaki kod kullanılabilir. Türetilmiş sınıf kurucusu, ilk satırın inherit yan tümcesi ve alanları görünür ile bildirilen açık alanlar olarak val anahtar sözcüğü. Daha fazla bilgi için bkz: açık alanları: val anahtar 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 küçük bir değişiklik gerekli olduğu durumlarda, devralma alternatif olarak bir nesne ifadesi kullanmayı düşünün. Aşağıdaki örnek, bir nesne ifadesi yeni türetilmiş bir tür oluşturma alternatif olarak kullanımını göstermektedir:

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 ifadeleri (F#).

Nesne hiyerarşisi oluştururken, discriminated Birliği yerine devralma kullanmayı göz önünde bulundurun. Discriminated sendikalar ayrıca ortak bir genel türü paylaşan farklı nesneleri yayımlayan modeli davranışını denetleyebilirsiniz. Tek bir discriminated Birliği genellikle birbirlerinin küçük farklılıkları olan türetilmiş sınıfları sayısı gereksinimini ortadan kaldırabilirsiniz. Discriminated sendikalar hakkında daha fazla bilgi için bkz: Discriminated sendikalar (F#).

Ayrıca bkz.

Başvuru

Nesne ifadeleri (F#)

Diğer Kaynaklar

F# dil başvurusu