Soyut sınıflar
Soyut sınıflar , bazı veya tüm üyelerini uygulanmayan sınıflardır ve bu sayede uygulamalar türetilmiş sınıflar tarafından sağlanabilmelidir.
Syntax
// 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
Açıklamalar
Nesne odaklı programlamada, soyut bir sınıf hiyerarşinin temel sınıfı olarak kullanılır ve farklı nesne türleri kümesinin yaygın işlevlerini temsil eder. "Soyut" adının gösterdiği gibi, soyut sınıflar genellikle sorun etki alanında doğrudan somut varlıklara karşılık gelmez. Ancak, yaygın olarak kaç farklı somut varlık olduğunu temsil eder.
Soyut sınıfların AbstractClass özniteliği olmalıdır. Uygulanamazlar ve uygulanmayan Üyeler üyelere sahip olabilirler. Bir sınıfa uygulandığında soyut olan terim kullanımı, diğer .net dilleridir. Ancak, yöntemlere (ve özelliklere) uygulandığında Özet teriminin kullanımı, F # ' ta diğer .NET dillerinde kullanımı biraz farklıdır. F # ' de bir yöntem abstract anahtar sözcüğüyle işaretlendiğinde, bu bir üyenin sanal bir dağıtım yuvası olarak bilinen, bu tür için iç sanal işlevlerin iç tablosunda bir girişi olduğunu gösterir. Diğer bir deyişle, virtual anahtar sözcüğü F # içinde kullanılmasa da, yöntemi sanal olur. Anahtar sözcüğü, abstract yöntemin uygulanıp uygulanmadığına bakılmaksızın sanal yöntemlerde kullanılır. Bir sanal dağıtım yuvasının bildirimi, bu dağıtım yuvası için bir yöntemin tanımından ayrıdır. Bu nedenle, bir sanal yöntem bildiriminin ve diğer bir .NET dilinde tanımın F # eşdeğeri, anahtar sözcüğü ya da anahtar sözcüğü ile birlikte bir soyut Yöntem bildiriminin ve ayrı bir tanımın birleşimidir default override . Daha fazla bilgi ve örnek için bkz. Yöntemler.
Bir sınıf, yalnızca tanımlanmış ancak tanımlanmamış soyut yöntemler varsa Özet olarak değerlendirilir. Bu nedenle, soyut yöntemleri olan sınıfların soyut sınıflar olması gerekmez. Bir sınıfın tanımsız soyut yöntemleri yoksa, abstract Ctclass özniteliğini kullanmayın.
Önceki sözdiziminde, Erişilebilirlik-değiştirici public veya olabilir private internal . Daha fazla bilgi için bkz. Erişim Denetimi.
Diğer türlerde olduğu gibi, soyut sınıfların bir temel sınıfı ve bir veya daha fazla temel arabirimi olabilir. Her temel sınıf veya arabirim, anahtar sözcüğüyle birlikte ayrı bir satırda görüntülenir inherit .
Soyut bir sınıfın tür tanımı, tam olarak tanımlanmış Üyeler içerebilir, ancak soyut Üyeler de içerebilir. Soyut üyelerin sözdizimi, Önceki sözdiziminde ayrı olarak gösterilir. Bu sözdiziminde, bir üyenin tür imzası , -> belirteç ve/veya * belirteçlere göre ayrılmış parametrelere uygun şekilde, sırasıyla parametre türlerini ve dönüş türlerini içeren bir listesidir. soyut üye türü imzaları için sözdizimi, imza dosyalarında kullanılan ve Visual Studio Code düzenleyicisinde ıntellisense tarafından gösterilen ile aynıdır.
Aşağıdaki kod, soyut olmayan iki türetilmiş sınıfa, kareyle ve daireye sahip olan bir soyut sınıf şeklini gösterir. Örnek, soyut sınıfların, yöntemlerin ve özelliklerin nasıl kullanılacağını gösterir. Örnekte, soyut sınıf şekli, somut varlıkların dairenin ve karenin ortak öğelerini temsil eder. Tüm şekillerin ortak özellikleri (iki boyutlu bir koordinat sisteminde) şekil sınıfına soyutlanır: kılavuzdaki konum, bir döndürme açısı ve alan ve çevre özellikleri. Bunlar, konum dışında, tek şekillerin değiştireamaması için geçersiz kılınabilir.
Döndürme yöntemi, kendi simetri nedeniyle dönüş sabiti olan Circle sınıfında olduğu gibi geçersiz kılınabilir. Bu nedenle, Circle sınıfında, döndürme yöntemi hiçbir şey olmayan bir yöntemle değiştirilmiştir.
// 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
// overridden.
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
Çıktıların
Perimeter of square with side length 10.000000 is 40.000000
Circumference of circle with radius 5.000000 is 31.415927
Area of Square: 100.000000
Area of Circle: 78.539816