فئات مجردة (F#)

فئات مجردة هي الفئات التي تترك بعض أو الجميع الأعضاء unimplemented، حيث يمكن توفير تطبيقات حسب الفئات المشتقة.

// 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

ملاحظات

في الكائنات ذات البرمجة، فئة مجردة هو تستخدم كفئة أساسية من تسلسل هرمي، ويمثل الوظائف عام لمجموعة متنوعة من أنواع الكائنات. كـ اسم "مجرده" يعني، clكـses مجردة غالباً لا تتوافق مع مباشرة على الخرسانة الوحدات في مجال المشكلة. ومع ذلك، تمثل ما العديد من وحدات ماديا آخر يكون بشكل عام.

يجب أن تتضمن الفئات المجردة AbstractClassالسمة. يمكن أن يكون لديك تطبيق و unimplemented الأعضاء. استخدام المصطلح مجردة عند تطبيق clكـs هو نفسه كـ بلغات غير ذلك.NET "؛ ومع ذلك، استخدام المصطلح مجردة عند تطبيق وظائف (وخصائص) يختلف قليلاً في F# استخدامها في اللغات الأخرى.NET. في F#, عند وضع علامة أسلوب مع abstractالكلمة الأساسية، وهذا إلى وجود عضو إدخال، يعرف ظاهري فتحه الإرسال ، في جدول داخلي ظاهري الوظائف لهذا النوع. بمعنى آخر، الأسلوب الظاهري، على الرغم من أن virtualلا يتم استخدام الكلمة الأساسية في F# لغة. الكلمة الأساسية abstractهو الذي يستخدم ظاهري أساليب بغض النظر عن ما إذا كان يتم تطبيق الأسلوب. تصريح الفتحة dهوpatch الظاهري هو منفصلة عن إعلان أسلوب لتلك الفتحة dهوpatch. ولذلك، F# المكافئ لتعريف أسلوب ظاهري وتعريف في لغة أخرى في.NET هو تركيبة من كل من إعلان أسلوب مجرد وتعريف منفصل، مع أي defaultالكلمة الأساسية أو overrideالكلمة الأساسية. لمزيد من المعلومات والأمثلة ، انظروظائف (F#) .

فئة هو بعين الاعتبار المجردة فقط إذا كان هناك مجردة من الطرق التي يتم تعريف ولكن لم يتم تعريف. ولذلك، فئات التي تحتوي على خلاصة أساليب ليست بالضرورة مجردة فئات. ما لم يحتوي على فئة غير معرفة الأساليب التجريدية، لا استخدم AbstractClassالسمة.

في بناء الجملة السابق، accessibility-modifierيمكن public، privateأو internal. لمزيد من المعلومات، راجع التحكم بالوصول (F#).

كما أن أساس مع أنواع غير ذلك مجردة فئة عم فئة وواجهات أساسية واحدة أو أكثر. يظهر كل فئة أساسية أو واجهة تشغيل سطر منفصل مع inheritكلمة أساسية.

يمكن أن تحتوي على تعريف نوع فئة مجردة الأعضاء المعرف بشكل كامل، ولكن يمكن أيضا أن يتضمن الأعضاء مجردة. بناء الجملة لأعضاء مجردة هو تظهر بشكل منفصل في بناء الجملة السابقة. في ترتيب هو بناء الجملة، type signatureالخاصة بعضو هو lهوt الذي يحتوي على أنواع المعلمات بالترتيب وأنواع الإرجاع، مفصولة ب ->الرموز المميزة و/او *رموز مميزة كما هو مناسب ل curried ومعلمات tupled. بناء الجملة للتواقيع نوع العضو مجردة هو نفسه كـ المستخدمة في توقيع ملفات والتي تظهر بخاصية التحسس الذكي في ‏‫Visual Studio محرر تعليمات برمجية.

مثال

توضح التعليمة البرمجية التالية فئة مجردة Shape، الذي يحتوي على جهازي غير-خلاصة اشتقاق فئات، Squareو Circle. هو موضح في المثال كيفية إلى استخدام فئات مجردة والأساليب والخصائص. في المثال، الملخص فئة Shapeتمثل العناصر عام دائرة الوحدات الخرسانة ومربعة. يتم الميزات عام لكافة الأشكال (في النظام الإحداثيات ثنائي الأبعاد) يتم استخراجها سحبها إلى Shapeفئة: الموقع تشغيل الشبكة، زاوية دوران، و المنطقة و الخصائص المحيطة. هذه يمكن تجاوزها، فيما عدا موضع، سلوك الذي لا يمكن تغيير الأشكال الفردية.

الأسلوب التدوير يمكن تجاوزها، كما في Circleللفئات، التي هو الاستدارة الثابتة وبسبب به التناظر. وفي هذه الحالة في Circleالفئة الأسلوب دوران هو استبداله بأسلوب الذي يقوم لا شيء.

// 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
// Output: 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 

راجع أيضًا:

المرجع

الفئات (F#)

وظائف (F#)

خصائص (F#)

المبادئ

الأعضاء (F#)