وظائف (F#)

على أسلوب هو دالة التي هو المقترن بنوع. في برمجة موجهة للكائنات، يتم استخدام أساليب إلى كشف وتنفيذ وظائف وسلوك الكائنات والأنواع.

// Instance method definition.
[ attributes ]
member [inline] self-identifier.method-name parameter-list [ : return-type ]=
    method-body

// Static method definition.
[ attributes ]
static member [inline] method-name parameter-list [ : return-type ]=
    method-body

// Abstract method declaration or virtual dispatch slot.
[ attributes ]
abstract member self-identifier.method-name : type-signature

// Virtual method declaration and default implementation.
[ attributes ]
abstract member [inline] self-identifier.method-name : type-signature
[ attributes ]
default member [inline] self-identifier.method-name parameter-list[ : return-type ] =
    method-body

// Override of inherited virtual method.
[ attributes ]
override member [inline] self-identifier.method-name parameter-list [ : return-type ]=
    method-body

ملاحظات

في بناء الجملة السابق، يمكنك رؤية نماذج متنوع من ملفات تعريف الأسلوب و ملفات تعريف. في نصوص أساسية للأسلوب أطول، فاصل الأسطر يتبع علامة التساوي (=)، والنص الكامل لأسلوب هو المقصود.

يمكن تطبيق سمات إلى أي تعريف الأسلوب. أن تسبق بناء الجملة لأسلوب تعريف وعادة مسرودة تشغيل سطر منفصل. لمزيد من المعلومات، راجع السمات (F#).

يمكن وضع وظائف علامة inline. للحصول على معلومات inline، راجع موضعي الوظائف (F#).

يمكن أن تكون وظائف بدون-المضمنة المستخدمة بشكل متكرر ضمن النوع؛ هو لا توجد حاجة لاستخدام بوضوح في recالكلمة الأساسية.

أساليب المثيل

يتم تعريف الأساليب مثيل باستخدام memberكلمة أساسية self-identifier، متبوعاً بنقطة (.) وأسلوب الاسم والمعلمات. كـ هو cكـe ل letروابط، parameter-listيمكن أن يكون نقش. بشكل عام، يجب إحاطة معلمات الأسلوب في أقواس في نموذج المجموعة، التي هو وظائف الطريقة التي تظهر في ب # عند إنشائها في اللغات الأخرى من برنامج.NET Framework. ومع ذلك، نموذج curried (مفصولة بمسافات معلمات) هو أيضا الأنماط عام وغير ذلك معتمدة أيضا.

يوضح المثال التالي تعريف واستخدام أسلوب مثيل غير الملخص.

type SomeType(factor0: int) =
   let factor = factor0
   member this.SomeMethod(a, b, c) =
      (a + b + c) * factor

   member this.SomeOtherMethod(a, b, c) =
      this.SomeMethod(a, b, c) * factor

ضمن وظائف مثيل، لا تقم باستخدام معرّف ذاتيا إلى الوصول إلى الحقول التي تم تعريفها باستخدام ارتباطات ودع. استخدام المعرف ذاتيا عند الوصول إلى الأعضاء آخرين و الخصائص.

ثابت وظائف

الكلمة الأساسية staticهو المستخدمة لتعيين استدعاء أسلوب بدون وجود مثيل و هو غير المقترنة بعنصر مثيل كائن. وإلا، الأساليب وظائف مثيل.

المثال الموجود في مقطع التالي بإظهار حقول التي تم تعريفها مع letتعريف الأعضاء خاصية الكلمة الأساسية، باستخدام memberكلمة أساسية، و تعريف أسلوب ثابت باستخدام staticالكلمة الأساسية.

يوضح المثال التالي بالتعريف و استخدام وظائف ثابتة. تفترض التي هذه أسلوب تعد التعريفات في SomeTypeالفئة في مقطع السابق.

static member SomeStaticMethod(a, b, c) =
   (a + b + c)

static member SomeOtherStaticMethod(a, b, c) =
   SomeType.SomeStaticMethod(a, b, c) * 100

الأساليب الظاهرية والأساليب المجردة

الكلمة الأساسية abstractيشير إلى أن أسلوب له فتحه إرسال ظاهري و قد لا تحتوي على تعريف في فئة. ظاهري فتحه الإرسال هو إدخال في جدول maintained داخليا الدالات المستخدمة في وقت التشغيل للبحث عن ظاهري استدعاء دالة في أحد أنواع الكائنات الإضافية. إليه الإرسال الظاهري هو الآلية التي تقوم بتنفيذ التعدد ، ميزة هامة من برمجة موجهة للكائنات. فصل دراسي واحد على الأقل أسلوب مجرد دون تعريف هو فئة مجردة ، مما يعني أنه لا يمكن يمكن تاريخ الإنشاء مثيلات لتلك الفئة. لمزيد من المعلومات حول فئات مجردة، راجع فئات مجردة (F#).

أسلوب مجرد تصريحات لا تحتوي على نص أسلوب. بدلاً من ذلك، اسم الأسلوب هو متبوعاً بنقطتين (:) وتوقيع نوع للأسلوب. أن توقيع نوع الأسلوب هو نفسه الذي يظهر بواسطة التحسس الذكي عند إيقاف مؤشر ماوس فوق اسم أسلوب في ‏‫Visual Studio محرر تعليمات برمجية، باستثناء بدون أسماء المعلمات. يتم أيضا عرض نوع التواقيع بواسطة المترجم، fsi.exe، إذا كنت تعمل بشكل تفاعلي. أن توقيع نوع الأسلوب هو يتكون lهوting عن أنواع المعلمات، متبوعاً بنوع الإرجاع، باستخدام رموز الفاصل المناسب. يتم فصل المعلمات curried بواسطة-> ويتم فصل المعلمات المجموعة بواسطة *. يتم دائماً فصل القيمة التي يتم إرجاعها من الوسيطات -> الرمز. يمكنك استخدام الأقواس لتجميع معلمات معقدة، على سبيل المثال عند كتابة دالة هو المعلمة، أو للإشارة إلى عند المجموعة هو التعامل معها كمعلمة واحدة وليس معلمتين.

يمكنك أيضا إعطاء الأساليب التجريدية الافتراضي ملفات تعريف بإضافة التعريف للفئة واستخدام defaultكلمة أساسية، كما هو مبين في حظر بناء الجملة في هذا الموضوع. أسلوب مجرد يحتوي على تعريف في نفس الفئة هو مساوية لأسلوب ظاهري في اللغات الأخرى من برنامج.NET Framework. أم لا يوجد تعريف، abstractالكلمة الأساسية بإنشاء منفذ إرسال جديدة في ظاهري دالة جدول فئة.

بغض النظر عن ما إذا كنت فئة الأساس implements الأساليب التجريدية به الفئات المشتقة يمكن أن يوفر طرق تطبيق الأساليب التجريدية. إلى تنفيذ أسلوب مجرد في فئة مشتقة، قم بتعريف أسلوب له نفس الاسم وتوقيع في فئة مشتقة، فيما عدا استخدام overrideأو defaultالكلمة الأساسية، وتوفير نص الأسلوب. الكلمات الأساسية overrideو defaultيعني بالضبط نفس الشيء. استخدام overrideإذا تجاوز أسلوب جديد تطبيق clكـs bكـe؛ استخدم defaultعندما تقوم بإنشاء تطبيق في clكـs نفس كـ الأصلي تصريح مجردة. لا تستخدم abstractالكلمة الأساسية تشغيل الأسلوب الذي يعمل تشغيل الطريقة التي تم التصريح بمجرد في الأساس فئة.

يلي مثال يوضح أسلوب مجرد Rotateيحتوي على تطبيق افتراضي، المكافئ لبرنامج.NET Framework الظاهري الأسلوب.

type Ellipse(a0 : float, b0 : float, theta0 : float) =
    let mutable axis1 = a0
    let mutable axis2 = b0
    let mutable rotAngle = theta0
    abstract member Rotate: float -> unit
    default this.Rotate(delta : float) = rotAngle <- rotAngle + delta

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

type Circle(radius : float) =
    inherit Ellipse(radius, radius, 0.0)
     // Circles are invariant to rotation, so do nothing.
    override this.Rotate(_) = ()

الأساليب الزائدة

وظائف overloaded هي الأساليب التي لها أسماء مطابقة في نوع محدد والتي تحتوي على آخر الوسيطات. في ب #، عادة ما يتم استخدام وسيطات اختيارية بدلاً من محملة فوق طاقتها وظائف. ومع ذلك، وظائف overloaded المسموح بها في لغة معينة، شرط أن الوسيطات الموجودة في النموذج بالمجموعة، النموذج لا curried.

مثال: خصائص و أساليب

يحتوي المثال التالي على نوع يحتوي على أمثلة حقول والدالات الخاصة، الخصائص وأسلوب ثابت.

type RectangleXY(x1 : float, y1: float, x2: float, y2: float) =
    // Field definitions.
    let height = y2 - y1
    let width = x2 - x1
    let area = height * width
    // Private functions.
    static let maxFloat (x: float) (y: float) =
      if x >= y then x else y
    static let minFloat (x: float) (y: float) =
      if x <= y then x else y
    // Properties.
    // Here, "this" is used as the self identifier,
    // but it can be any identifier.
    member this.X1 = x1
    member this.Y1 = y1
    member this.X2 = x2
    member this.Y2 = y2
    // A static method.
    static member intersection(rect1 : RectangleXY, rect2 : RectangleXY) =
       let x1 = maxFloat rect1.X1 rect2.X1
       let y1 = maxFloat rect1.Y1 rect2.Y1
       let x2 = minFloat rect1.X2 rect2.X2
       let y2 = minFloat rect1.Y2 rect2.Y2
       let result : RectangleXY option =
         if ( x2 > x1 && y2 > y1) then
           Some (RectangleXY(x1, y1, x2, y2))
         else
           None
       result

// Test code.
let testIntersection =
    let r1 = RectangleXY(10.0, 10.0, 20.0, 20.0)
    let r2 = RectangleXY(15.0, 15.0, 25.0, 25.0)
    let r3 : RectangleXY option = RectangleXY.intersection(r1, r2)
    match r3 with
    | Some(r3) -> printfn "Intersection rectangle: %f %f %f %f" r3.X1 r3.Y1 r3.X2 r3.Y2
    | None -> printfn "No intersection found."

testIntersection

راجع أيضًا:

المبادئ

الأعضاء (F#)