Soyut sınıflar (F#)
Soyut sınıflar uygulamalarında türetilmiş sınıfları tarafından sağlanabilir olacak şekilde gerçeklenmemiş, bazı veya tüm üyeleri bırakın sınıflardır.
// Abstract class syntax.
[<AbstractClass>]
type [ accessibility-modifier ] abstract-class-name =
[ inherit base-class-or-interface-name ]
[ abstract-member-declarations-and-member-definitions ]
// Abstract member syntax.
abstract member member-name : type-signature
Notlar
Nesne tabanlı programlama, soyut bir sınıf hiyerarşisini temel bir sınıf kullanılır ve bir dizi farklı nesne türlerini ortak işlevselliğini temsil eder. "Özet" adı da anlaşılacağı gibi soyut sınıfların doğrudan sorunu etki alanındaki somut varlıklar üzerine genellikle benzemez. Ancak, hangi ortak birçok farklı somut varlıklar sahip temsil ettikleri.
Soyut sınıfların olmalıdır AbstractClass özniteliği. Bunlar uygulanan ve üyeleri gerçeklenmemiş. Teriminin kullanımı soyut için uygulandığında aynı diğer sınıfıdır.net dilleri; Ancak, teriminin kullanımı soyut yöntemleri (ve özellikleri) uygulandığında bir biraz F#'taki diğer kullanımı farklıdır.net dilleri. f bir yöntem ile işaretli olduğunda #, abstract bu anahtar sözcüğü gösterir bir üyesi olarak bilinen bir giriş var. bir sanal gönderme yuva, iç tablo türü sanal işlevler. Başka bir deyişle, yöntemin sanal, rağmen virtual F# dilinde anahtar sözcük kullanılmaz. Anahtar sözcük abstract olup uygulanan yöntemi ne olursa olsun, sanal yöntemleri kullanılır. Sanal gönderme yuvası bildirimi Bu gönderme yuvası için bir yöntem tanımının farklıdır. Bu nedenle, F# eşdeğer bir sanal yöntem bildirimi ve başka bir tanımı.net dildir hem bir Özet yöntem bildirimi ve ya da ayrı bir tanımı default anahtar sözcüğünü ya da override anahtar sözcüğü. Daha fazla bilgi ve örnekler için bkz, Yöntemleri (F#).
Bir sınıf bildirilmiş olan, ancak tanımlı değil Soyut yöntemler varsa soyut olarak kabul edilir. Bu nedenle, soyut yöntemler olan sınıfları mutlaka soyut sınıflar değildir. Bir sınıf Soyut yöntemler tanımsız sürece kullanmayın AbstractClass özniteliği.
In the previous syntax, accessibility-modifier can be public, private or internal. Daha fazla bilgi için bkz. Erişim denetimi (F#).
Soyut sınıfların diğer türlerle olduğu gibi temel bir sınıf ve biri veya birkaçı arabirimleri temel olabilir. Her temel sınıfı veya arabirimi ile birlikte ayrı bir satırda görünür inherit anahtar sözcüğü.
Soyut bir sınıf türü tanımı tam olarak tanımlanan üyeler içerebilir, ancak soyut üyeler içerebilir. Soyut üyeleri için sözdizimi, önceki sözdiziminde ayrı ayrı gösterilir. Bu sözdizimi, type signature üye içeren bir liste sırası ve dönüş türleri parametre türleri ayrılır -> belirteçleri ve/veya * belirteçler uygun şekilde curried için ve tupled parametreleri. İmza dosyalarında kullanılan ve IntelliSense Visual Studio Kod Düzenleyicisi'nde gösterilen aynı soyut üye türü imzalar sözdizimi aşağıdaki gibidir.
Örnek
Aşağıdaki kod bir soyut sınıf gösterir Shape, sahip olduğu iki soyut olmayan türetilmiş sınıflar, Square ve Circle. Örnek soyut sınıfları, yöntemleri ve özellikleri nasıl gösterir. Örnekte, soyut bir sınıf Shape somut varlıklar circle ve square ortak öğeleri temsil eder. (İki boyutlu koordinat sistemi) tüm şekiller'in ortak özelliklerinin dışarı içine kısaltılır Shape sınıfı: ızgara, bir dönüş açısı ve alan ve çevre özellikleri konum. Bunlar, pozisyon dışında hangi tek tek şekilleri değiştirme davranışı kılınabilir.
Dönüş yöntemi, gibi de kılınabilir Circle nedeniyle, Simetri dönüşü sabit olduğu sınıf. Bunu, Circle sınıfı dönüşü yöntemi yapmaz bir yöntemle değiştirildi.
// An abstract class that has some methods and properties defined
// and some left abstract.
[<AbstractClass>]
type Shape2D(x0 : float, y0 : float) =
let mutable x, y = x0, y0
let mutable rotAngle = 0.0
// These properties are not declared abstract. They
// cannot be overriden.
member this.CenterX with get() = x and set xval = x <- xval
member this.CenterY with get() = y and set yval = y <- yval
// These properties are abstract, and no default implementation
// is provided. Non-abstract derived classes must implement these.
abstract Area : float with get
abstract Perimeter : float with get
abstract Name : string with get
// This method is not declared abstract. It cannot be
// overriden.
member this.Move dx dy =
x <- x + dx
y <- y + dy
// An abstract method that is given a default implementation
// is equivalent to a virtual method in other .NET languages.
// Rotate changes the internal angle of rotation of the square.
// Angle is assumed to be in degrees.
abstract member Rotate: float -> unit
default this.Rotate(angle) = rotAngle <- rotAngle + angle
type Square(x, y, sideLengthIn) =
inherit Shape2D(x, y)
member this.SideLength = sideLengthIn
override this.Area = this.SideLength * this.SideLength
override this.Perimeter = this.SideLength * 4.
override this.Name = "Square"
type Circle(x, y, radius) =
inherit Shape2D(x, y)
let PI = 3.141592654
member this.Radius = radius
override this.Area = PI * this.Radius * this.Radius
override this.Perimeter = 2. * PI * this.Radius
// Rotating a circle does nothing, so use the wildcard
// character to discard the unused argument and
// evaluate to unit.
override this.Rotate(_) = ()
override this.Name = "Circle"
let square1 = new Square(0.0, 0.0, 10.0)
let circle1 = new Circle(0.0, 0.0, 5.0)
circle1.CenterX <- 1.0
circle1.CenterY <- -2.0
square1.Move -1.0 2.0
square1.Rotate 45.0
circle1.Rotate 45.0
printfn "Perimeter of square with side length %f is %f, %f"
(square1.SideLength) (square1.Area) (square1.Perimeter)
printfn "Circumference of circle with radius %f is %f, %f"
(circle1.Radius) (circle1.Area) (circle1.Perimeter)
let shapeList : list<Shape2D> = [ (square1 :> Shape2D);
(circle1 :> Shape2D) ]
List.iter (fun (elem : Shape2D) ->
printfn "Area of %s: %f" (elem.Name) (elem.Area))
shapeList