Sınıflar (F#)
Sınıfları özelliklerini, yöntemlerini ve olaylarını içeren nesneleri temsil eden türleridir.
// Class definition:
type [access-modifier] type-name [type-params] [access-modifier] ( parameter-list ) [ as identifier ] =
[ class ]
[ inherit base-type-name(base-constructor-args) ]
[ let-bindings ]
[ do-bindings ]
member-list
...
[ end ]
// Mutually recursive class definitions:
type [access-modifier] type-name1 ...
and [access-modifier] type-name2 ...
...
Notlar
Sınıfların temel tanımını gösterir.net nesne türleri; nesne tabanlı programlama F# destekler birincil tür kavramı sınıfıdır.
Yukarıdaki sözdiziminde, type-name geçerli herhangi bir tanımlayıcıdır. type-params İsteğe bağlı genel türde parametreler açıklanır. Tür parametre adları ve kısıtlamaları açılı parantezler içinde oluşur (< ve >). Daha fazla bilgi için, bkz. Generics (F#) ve Kısıtlamaları (F#). parameter-list Yapıcı parametreleri açıklar. İlk erişim değiştiricisi türü için geçerlidir; İkinci birincil yapıcısına ilgilidir. Her iki durumda da, varsayılan değer olan public.
Bir sınıf için temel sınıf kullanarak belirttiğiniz inherit anahtar sözcüğü. Temel sınıf kurucusunu için ayraç içinde baðýmsýz deðiþkenleri saðlamalýsýnýz.
Alan veya işlevini kullanarak sınıf yerel değerleri let bağlar ve genel kuralları izleyin gerekir let bağlar. do-bindings Bölümünde Nesne oluşturmayı yürütülen kod içerir.
member-list Ek Kurucular, örnek ve static yöntem bildirimleri, arabirimi bildirimlerini, soyut bağlar ve özelliği ve olay bildirimleri oluşur. Bunlar açıklanan Üyeler (F#).
identifier Kullanılan isteğe bağlı WITH as anahtar sözcüğünü örnek değişkeni ya da tür tanımında türü örneğine başvurmak için kullanılan kendini tanımlayıcı bir ad verir. Daha fazla bilgi için bu konunun ilerisinde Self tanımlayıcıları bölümüne bakın.
Anahtar sözcükler class ve end başlangıcı işaretler ve tanım sonuna isteğe bağlı.
Karşılıklı olarak birbirine başvuru türleri olan özyinelemeli türleri ile birlikte katılan and karşılıklı olarak yinelemeli işlevler gibi yalnızca anahtar sözcük. Örneğin, karşılıklı olarak çoğaltılan türler bölümüne bakın.
Oluşturucular
Sınıf türü örneği oluşturan kod kurucudur. Diğer göründüklerinden Kurucular sınıfları için biraz farklı F# çalışır.net dilleri. Bir F# sınıfında alındığında, bağımsız anlatılan birincil bir kurucu parameter-list adını yazın ve oluşur, gövde izleyen let (ve let rec) bağlar sınıf bildirisinin başlangıcında ve do izleyin bağlar. Birincil yapıcısının sınıf bildirimi boyunca kapsam içindeki değişkenlerdir.
Ek Kurucular kullanarak ekleme new gibi bir üye eklemek için anahtar sözcük:
new(argument-list) = constructor-body
Yeni kurucunun gövdesini sınıf bildirisinin en üstünde belirtilen birincil kurucusunu çağırmalıdır.
Aşağıdaki örnekte, bu kavramı gösterir. Aşağıdaki kodda, MyClass iki oluşturucusu yok, iki baðýmsýz deðiþken alýr birincil bir kurucu ve başka bir yapıcı, hiçbir bağımsız değişken alır.
type MyClass1(x: int, y: int) =
do printfn "%d %d" x y
new() = MyClass1(0, 0)
Let ve bağlamaları yapın
let Ve do bir sınıf tanımı bağlarında ana sınıf kurucunun gövdesini oluştururlar ve bu nedenle çalıştırmaları her sınıf örneği oluşturulur. Yoksa bir let bağlama bir işlevi olan ve üye derlendi. let Bağlama, herhangi bir işlev veya üye kullanılmayan bir değer ve ardından yapıcısına yerel bir değişken içine derlenmiş. Aksi durumda, sınıf alanına derlenir. do İzleyin ifadeler birincil yapıcı derlenmiş ve her örneği için başlatma kodu yürütün. Herhangi bir ek Kurucular her zaman birincil oluşturucusunu çağırın çünkü let bağlar ve do bağları her zaman yürütme yapıcı adlı, ne olursa olsun.
Tarafından oluşturulan alanları let bağlantılar yöntemlerini ve özelliklerini; sınıfın erişilebilir Statik yöntemler bir örnek değişkenini parametre olarak alır, ancak bunlar statik yöntemleri, erişilemez. Varsa, bunlar kendini bir tanımlayıcı kullanılarak erişilemez.
Kendini tanımlayıcıları
A kendini tanımlayıcı geçerli örneğini temsil eden bir addır. Kendini tanımlayıcıları benzer this C# ya da C++ bir anahtar sözcük veya Me Visual Basic. Kendini bir tanımlayıcı kapsamdaki tüm sınıf tanımını veya yalnızca tek bir yöntem olarak kendini tanımlayıcı istediğinize bağlı olarak iki farklı şekilde tanımlayabilirsiniz.
Tüm sınıf için kendini bir tanımlayıcı tanımlamak için kullanın as sonra ayraç yapıcı parametre anahtar sözcük listesi ve tanımlayıcı adını belirtin.
Kendini bir tanımlayıcı için tek yöntem tanımlamak için üye bildirimi, yöntemin adı ve ayırıcı olarak nokta (.) hemen önce kendini bir tanımlayıcı sağlar.
Aşağıdaki kod örneği, kendini tanımlayıcısını oluşturmak için iki yol göstermektedir. İlk satırda as anahtar sözcüğünü kendini tanımlayıcısını tanımlamak için kullanılır. Beşinci satır, tanımlayıcı olarak this kapsamını yöntemine Yasak kendini bir tanımlayıcı tanımlamak için kullanılan PrintMessage.
type MyClass2(dataIn) as self =
let data = dataIn
do
self.PrintMessage()
member this.PrintMessage() =
printf "Creating MyClass2 with Data %d" data
Aksine diğer.net dilleri istediğiniz ancak kendini tanımlayıcı adı verebilirsiniz; sizin için adları gibi Yasak değil self, Me, veya this.
İle bildirilen kendini tanımlayıcı as anahtar sözcüğünü başlatılmadı kadar sonra let bağları çalıştırılır. Bu nedenle, onu kullanılamaz let bağlar. Kendini bir tanımlayıcı kullanabilirsiniz do bindings bölümünü.
Genel Tür Parametreleri
Genel türde parametreler köşeli parantez içinde belirtilen (< ve >), tek bir tırnak işareti bir tanımlamayı şeklinde. Birden çok genel bir tür parametreleri noktalı virgüllerle ayrılır. Bildirimi boyunca kapsam içindeki genel tür parametresidir. Aşağıdaki kod örneği, genel tür parametrelerini belirtmek gösterilmiştir.
type MyGenericClass<'a> (x: 'a) =
do printfn "%A" x
Tür bağımsız değişkeni türü kullanıldığında algılanır. Aşağıdaki kodda inferred dizilerini bir dizi türüdür.
let g1 = MyGenericClass( seq { for i in 1 .. 10 -> (i, i*i) } )
Devralma belirtme
inherit Yan tümcesi varsa doğrudan temel sınıf tanımlar. F# doğrudan tek bir temel sınıf izin verilir. Arabirimleri uygulayan bir sınıf temel sınıflar dikkate alınmaz. Arabirimler açıklanan Arabirimler (F#) konu.
Dil anahtar sözcüğünü kullanarak türetilmiş sınıftan yöntemlerini ve özelliklerini temel sınıf erişebilirsiniz base tanımlayıcı olarak, arkasından bir nokta (.) ve üyenin adı.
Daha fazla bilgi için bkz. Kalıtım (F#).
Üye bölümü
Bu bölümde, statik veya örnek yöntemleri, özellikleri, arabirim uygulamaları, soyut üyeleri, olay bildirimleri ve ek Kurucular tanımlayabilirsiniz. Olanak sağlar ve bu bölümdeki bağlantıları bulunamaz yapın. F# türleriyle sınıflarına ek olarak çeşitli eklenebilecek üyelerin çünkü ayrı bir konuda açıklanan Üyeler (F#).
Karşılıklı olarak çoğaltılan türler
Dairesel bir şekilde birbirine başvuru türleri tanımladığınızda, birlikte tür tanımları kullanılarak dize and anahtar sözcüğü. and Anahtar sözcüğü değiştirir type ilk tanımı aşağıdaki gibi dışındaki tüm anahtar sözcük.
open System.IO
type Folder(pathIn: string) =
let path = pathIn
let filenameArray : string array = Directory.GetFiles(path)
member this.FileArray = Array.map (fun elem -> new File(elem, this)) filenameArray
and File(filename: string, containingFolder: Folder) =
member this.Name = filename
member this.ContainingFolder = containingFolder
let folder1 = new Folder(".")
for file in folder1.FileArray do
printfn "%s" file.Name
Çıktı, geçerli dizindeki tüm dosyaların listesidir.
Sınıflar, sendikalar, kayıtları ve yapıları kullanıldığı durumlar
Çeşitli aralarından türleri verildiğinde, ne her türü için belirli bir durum için uygun türü seçmek için tasarlanmış, iyi bir anlayış olması gerekir. Sınıfları, nesne yönelimli programlama bağlamlarda kullanmak için tasarlanmıştır. Nesne tabanlı programlama olduğu için yazılmış uygulamalarda kullanılan baskın kip.net Framework. F# kodu yakından çalışmak olup olmadığını.net Framework veya başka bir nesne yönelimli kitaplığı ve özellikle kullanıcı Arabirimi kitaplığı gibi bir nesne yönelimli türü sisteminden genişletmek varsa, büyük olasılıkla uygun sınıflardır.
Size yakın nesne yönelimli kod ile birlikte çalışma değil veya bağımsızdır ve nesne yönelimli kodu sık etkileşim bu nedenle korunan kod yazıyorsanız, kayıtları kullanmayı düşünmelisiniz ve sendikalar discriminated. Geçmiş olsun, tek bir thought–out uygun desen eşleştirme kodu ile birlikte Birliği discriminated, genellikle bir nesne hiyerarşisi için daha basit bir alternatif olarak kullanılabilir. Discriminated sendikalar hakkında daha fazla bilgi için bkz: Discriminated sendikalar (F#).
Kayıtlar için sınıflar basit olmanın avantajı olsa da, bir tür talepleri ile bunların Basitlik gerçekleştirilebilir aştıklarında kayıtları uygun değildir. Temelde basit aggregates değerlerin özel eylemleri gerçekleştirebilirsiniz ayrı Kurucular, gizli alanlar, olmadan ve devralma veya arabirim uygulamaları kayıtlardır. Özellikler ve yöntemler gibi üyeleri davranışlarını daha karmaşık hale getirmek için kayıt eklenebilir, ancak bir kayıtta depolanan hala basit bir toplama değerlerini alanlardır. Kayıt hakkında daha fazla bilgi için bkz: Kayıtları (F#).
Yapıları veri küçük toplamları için yararlı olduğu halde olmaları bakımından sınıfları ve kayıtları birbirinden farklı.net değer türleri. Sınıflar ve kayıt edilir.net başvuru türleri. Sözdizimi değer türleri ile başvuru türleri, değer türleri değer tarafından geçirilen bakımından farklıdır. Yani kopyalanır ve bir parametre olarak geçirilen veya bir işlevinden döndürülen bit bit. Bunlar da yığın üzerinde depolanan veya, yerine üst nesne içine katıştırılmış bir alan olarak kullanılması durumunda öbek üzerinde kendi ayrı konumda depolanır. Bu nedenle, öbek erişme ek yükü bir sorun olduğunda sık erişilen veri yapıları uygundur. Yapıları hakkında daha fazla bilgi için bkz: Yapıları (F#).