Arabirimler (F#)
Arabirimler uygulayan diğer sınıflar ilgili üyeleri kümesi belirtin.
// Interface declaration:
[ attributes ]
type interface-name =
[ interface ]
[ inherit base-interface-name ...]
abstract member1 : [ argument-types1 -> ] return-type1
abstract member2 : [ argument-types2 -> ] return-type2
...
[ end ]
// Implementing, inside a class type definition:
interface interface-name with
member self-identifier.member1 argument-list = method-body1
member self-identifier.member2 argument-list = method-body2
// Implementing, by using an object expression:
[ attributes ]
let class-name (argument-list) =
{ new interface-name with
member self-identifier.member1 argument-list = method-body1
member self-identifier.member2 argument-list = method-body2
[ base-interface-definitions ]
}
member-list
Notlar
Hiçbir üyesi uygulanan dışında sınıf bildirimleri arabirimi bildirimlerini benzer.Bunun yerine, tüm üyeleri anahtar sözcüğe göre belirtildiği gibi soyut, abstract.Yöntem gövdesi için Soyut yöntemler sağlamaz.Ancak, ayrı bir üye tanımı ile birlikte bir yöntem olarak da dahil ederek bir varsayýlan uygulama sağlayabilirsiniz default anahtar sözcüğü.Bunu yaparsanız, bir taban sınıftaki diğer sanal bir yöntem yaratmak için bu nedenle eşdeğerdir.net dilleri.Sanal bir yöntem arabirimini uygulayan sınıflar içinde geçersiz kılınabilir.
Arabirim uygulamak için iki yol vardır: nesne ifadeleri kullanarak ve sınıf türleri kullanarak.Her iki durumda da, sınıf türü veya nesneyi ifade yöntem gövdeleri için arabirim Soyut yöntemler sağlar.Uygulamaları arabirimini uygulayan her türe özgüdür.Bu nedenle, arabirim yöntemleri farklı türleri birbirinden farklı olabilir.
Anahtar sözcükler interface ve end, başlangıç ve bitiş tanımının işaretlemek, isteğe bağlı hafif sözdizimini kullandığınızda.Bu sözcükleri kullanmayın, derleyici tür bir sınıf veya arabirim kullandığınız yapıları analiz ederek olup gerçekleştirip dener.Üye tanımlayın veya diğer sınıf sözdizimi kullanırsanız, bu tür bir sınıf olarak yorumlanır.
.Stil kodlama net olduğu tüm arabirimlerin büyük harf ı ile başlamak için I.
Sınıf türleri kullanarak arabirimleri uygulayan
Sınıf türü içinde bir veya daha çok arabirimler kullanarak uygulayabilirsiniz interface anahtar sözcüğü, arabirimin adını ve with tarafından arabirim üye tanımlamaları, aşağıdaki kodda gösterildiği gibi sözcüğünü,.
type IPrintable =
abstract member Print : unit -> unit
type SomeClass1(x: int, y: float) =
interface IPrintable with
member this.Print() = printfn "%d %f" x y
Arabirim uygulamaları devralınır, böylece herhangi bir türetilmiş sınıflar bunları reimplement gerekmez.
Arabirim yöntemleri çaðýrmak
Herhangi bir nesne arabirimi uygulayan türü üzerinden değil yalnızca arabiriminden arabirim yöntemleri çağrılabilir.Bu nedenle, arabirim türü için yukarı çevrim kullanarak gerekebilir :> işleç veya upcast bu yöntemleri çağırmak için işleci.
Türünde bir nesne varsa, arabirim yöntemi çağırmak için SomeClass, aşağıdaki kodda gösterildiği gibi yukarı çevrim arabirim türü için nesne gerekir.
let x1 = new SomeClass1(1, 2.0)
(x1 :> IPrintable).Print()
Alternatif yöntem nesne üzerinde o upcasts bildirmek için ve aşağıdaki örnekte olduğu gibi arabirim yöntemini çağırır.
type SomeClass2(x: int, y: float) =
member this.Print() = (this :> IPrintable).Print()
interface IPrintable with
member this.Print() = printfn "%d %f" x y
let x2 = new SomeClass2(1, 2.0)
x2.Print()
Nesne ifadeleri kullanarak arabirimleri uygulayan
Nesne ifadeleri bir arabirim geliþtirmek için kısa bir yol sağlar.Bunlar, adlandýrýlmýþ bir tür oluşturmak gerekmez ve yalnızca ek yöntemleri olmadan arabirim yöntemlerini destekleyen bir nesneyi istediğiniz zaman yararlı olur.Aşağıdaki kodda bir nesne ifadesi gösteriliyor.
let makePrintable(x: int, y: float) =
{ new IPrintable with
member this.Print() = printfn "%d %f" x y }
let x3 = makePrintable(1, 2.0)
x3.Print()
Arabirim devralma
Arabirimleri, bir veya daha fazla temel arabirimden devralabilir.
type Interface1 =
abstract member Method1 : int -> int
type Interface2 =
abstract member Method2 : int -> int
type Interface3 =
inherit Interface1
inherit Interface2
abstract member Method3 : int -> int
type MyClass() =
interface Interface3 with
member this.Method1(n) = 2 * n
member this.Method2(n) = n + 100
member this.Method3(n) = n / 10