الفئات (F#)

فئات هي الأنواع التي تمثل الكائنات التي يمكن أن تحتوي الخصائص، والأساليب و الأحداث.

// Class definition:
type [access-modifier] type-name [type-params]( parameter-list ) [ as identifier ] =
   [ class ]
     [ inherit base-type-name(base-constructor-args) ]
     [ let-bindings ]
     [ do-bindings ]
     member-list
      ...
   [ end ]
// Mutually recursive class definitions:
type [access-modifier] type-name1 ...
and [access-modifier] type-name2 ...
...

ملاحظات

تمثل الفئات الأساسية وصف.NET أنواع الكائنات؛ الفئة هو مفهوم النوع الأساسي التي تدعم برمجة موجهة للكائنات في ب #.

في بناء الجملة السابق، type-nameهو معرّف صالح. type-paramsيصف اختياري معلمات نوع عام. تتكون من نوع أسماء المعلمات والمحاط constraفيts في أقواس زاوية (<و>). للمزيد من المعلومات، راجع عام (F#) والقيود (F#). parameter-listوصف معلمات الدالة الإنشائية.

حدد فئة Base لفئة باستخدام inheritكلمة أساسية. يجب توفير وسيطات، بين قوسين، الدالة الإنشائية فئة الأساس.

قم بتعريف حقول أو تعمل قيم التي تكون محلية إلى الفئة باستخدام letروابط، و يجب أن تتبع القواعد عام ل letالروابط. do-bindingsمقطع تحتوي على تعليمات برمجية تنفيذها عند إنشاء الكائن.

member-listيتكون من المنشئات إضافى، مثيل وأسلوب ثابت تصريحات، تعريفات الواجهة، روابط مجردة، والخصائص والأحداث تصريحات. هذه هي الموصوفة في الأعضاء (F#).

identifierيستخدم مع اختياري asالكلمة الأساسية يعطي اسم متغير مثيل، أو معرّف ذاتيا، والتي يمكن استخدامها في تعريف النوع للإشارة إلى مثيل لنوع. للحصول على مزيد من المعلومات، راجع مقطع معرفات Self لاحقاً في هذا الموضوع.

الكلمات الأساسية classو endالذي وضع علامة البداية ونهاية التعريف اختياريان.

شكل متكرر أنواع، والتي هي الأنواع التي تشير إلى كل غير ذلك، المرتبطة مع andالكلمة الأساسية فقط كشكل عودي الدالات يتم. على سبيل مثال، راجع مقطع "أنواع عودى يدوياً".

جهات الإنشاء

الدالة الإنشائية هو الرمز الذي يقوم بإنشاء مثيل لنوع الفئة. تعمل المنشئات لفئات مختلفة إلى حد ما في F# عن ما تكون عليه في اللغات.NET غير ذلك. في F# دراسي، هو دائماً على الدالة الإنشائية أساسي الوسيطات الخاصة به الموضحة في parameter-listالذي يتبع اسم النوع، و consهوts الأساسي الخاص به من روابط let(andlet rec) بداية إعلان فئة و doروابط تلك المتابعة. الوسيطات من الدالة الإنشائية الأساسية هي في نطاق من خلال إعلان فئة.

يمكنك إضافة construcإلىrs إضافى باستخدام newالكلمة الأساسية إلى إضافة عضو، كالتالي:

new(argument-list) = constructor-body

نص جديد الدالة الإنشائية يجب استدعاء الأساسي الدالة الإنشائية المحدد في الجزء العلوي إعلان فئة.

يلي مثال يوضح هذا المفهوم. في ما يلي تعليمات برمجية، MyClassالمنشئات الثاني، على الدالة الإنشائية أساسية التي تأخذ الوسيطتين الدالة الإنشائية آخر التي تأخذ لا توجد وسيطات.

type MyClass1(x: int, y: int) =
   do printfn "%d %d" x y
   new() = MyClass1(0, 0)

تسمح و القيام بالربط

letو doالروابط في تعريف فئة نص الدالة الإنشائية الفئة الأساسية، ولذلك تشغيلها كلما مثيل فئة ما هو تاريخ الإنشاء. إذا كان letربط هو دالة، ثم هو المترجمة في عضو. إذا letربط هو القيمة مستخدم في أي وظيفة أو عضو، ثم تم تحويله برمجياً إلى متغير غير المحلية على الدالة الإنشائية. Otherwهوe، فإنه هو التجميع في حقل الفئة. doيتم التحويل البرمجي للتعبيرات التي تتبع في الدالة الإنشائية الأساسي و تنفيذ تعليمات برمجية تهيئة لكل مثيل. لأن أي المنشئات الإضافية دوماً باستدعاء المنشئ الأساسي letالروابط و doالربط بينفذ دائماً بغض النظر عن أي الدالة الإنشائية هو تسمى.

حقول التي يتم إنشاؤها بواسطة letروابط يمكن الوصول إليها من خلال وظائف وخصائص فئة؛ ومع ذلك، لا يمكن الوصول إليها من وظائف ثابتة، حتى في حالة اتخاذ وظائف ثابتة متغير مثيل كمعلمة. لا يمكن الوصول إليها باستخدام معرّف ذاتيا، إذا واحد موجوداً.

معرفات ذاتية

على معرّف ذاتيا هو اسم الذي يمثل المثيل الحالي. تشبه معرفات ذاتيا thisكلمة أساسية في C# أو C + + أو Meفي Visual أساسى. يمكنك تعريف معرفاً ذاتيا بطريقتين مختلفتين، استناداً إلى ما إذا كنت تريد المعرف ذاتيا في نطاق للكل فئة تعريف أو لأسلوب فردية فقط.

إلى تعريف معرّف ذاتيا للفئة كاملة، استخدم asالأساسية بعد أقواس الإغلاق معلمة construcإلىr قائمة، وحدد اسم معرّف.

إلى تعريف معرّف ذاتيا لأسلوب واحد فقط، قم بتوفير معرّف ذاتيا في تصريح عضو، قبل ‏‏اسم الأسلوب ونقطة (.) separaإلىr مباشرة.

يلي تعليمات برمجية يوضح المثال طريقتين لإنشاء معرّف ذو ذاتيا. في السطر أول، asالكلمة الأساسية هو المستخدمة لتعريف معرّف ذاتيا. في السطر الخامس، معرّف thisهو المستخدمة لتحديد نطاق الخاص بها هو معرّف ذاتيا هو مقيد إلى الأسلوب PrintMessage.

type MyClass2(dataIn) as self =
   let data = dataIn
   do
       self.PrintMessage()
   member this.PrintMessage() =
       printf "Creating MyClass2 with Data %d" data

بعكس لغات.NET الأخرى، يمكنك تسمية معرّف ذاتيا ولكن تريد؛ غير المقيدة إلى أسماء مثل self، Me، أو this.

معرّف ذاتيا التي هو تم تعريفه مع asالكلمة الأساسية هو عدم تهيئة حتى بعد letيتم تنفيذ عمليات الربط. ولذلك، لا يمكن استخدامه في letالروابط. يمكنك استخدام معرّف ذاتيا في doمقطع "الارتباطات".

معلمات النوع العام

يتم تعيين معلمات نوع عام في أقواس زاوية (<و>)، في شكل متبوعاً بعلامة اقتباس مفردة بواسطة معرّف. عامة متعددة معلمات نوع مفصولة بفاصلات. معلمة نوع عام هو في مجال خلال التصريح. يظهر المثال تعليمات برمجية التالي كيفية تعيين معلمة نوع عام.

type MyGenericClass<'a> (x: 'a) = 
   do printfn "%A" x

كتابة الوسائط الاستدلال عندما النوع هو المستخدم. في التعليمة البرمجية التالية، ونوع inferred هو تسلسل من المجموعات عن.

let g1 = MyGenericClass( seq { for i in 1 .. 10 -> (i, i*i) } )

تحديد توريث

inheritعبارة تعريف فئة Base مباشر، إذا كان هناك هو واحد. في F#, يتم السماح فئة الأساس مباشر واحد فقط. لا تعتبر واجهات تطبيق فئة فئات أساسية. الواجهات التي تم مناقشتها في واجهات (F#)موضوع.

يمكنك الوصول إلى الوظائف و خصائص فئة الأساس من الفئة المشتقة باستخدام الكلمة الأساسية للغة baseكمعرّف، متبوعاً بنقطة (.) و اسم العضو.

لمزيد من المعلومات، راجع وراثة (F#).

مقطع الأعضاء

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

أنواع عودى تبادلية

عندما تقوم بتعريف أنواع مرجع بعضها البعض بشكل دائري، سلسلة معا على ملفات تعريف نوع باستخدام andالكلمة الأساسية. andاستبدال الكلمة الأساسية typeالكلمة الأساسية تشغيل الجميع التعريف أول، باستثناء كـ يلي.

open System.IO

type Folder(pathIn: string) =
  let path = pathIn
  let filenameArray : string array = Directory.GetFiles(path)
  member this.FileArray = Array.map (fun elem -> new File(elem, this)) filenameArray

and File(filename: string, containingFolder: Folder) = 
   member this.Name = filename
   member this.ContainingFolder = containingFolder

let folder1 = new Folder(".")
for file in folder1.FileArray do
   printfn "%s" file.Name

الإخراج هو lهوt لكافة الملفات في الدليل الحالي.

عند استخدام إلى فئات الاتحادات، السجلات وبني

تحديد مجموعة متنوعة أنواع للاختيار من بينها، يجب أن يكون لديك فهم جيد لكل نوع هو مصمم من أجل تحديد النوع المناسب لموقف معين. فئات مصممة للاستخدام في كائن-موجه سياقات في البرمجة. الكائن البشري البرمجة هو شائعا السائد استخدامها في التطبيقات التي تتم كتابتها للمكون.NET Framework. إذا كان F# تعليمات برمجية له للعمل عن قرب مع إطار عمل.NET أو مكتبة موجهة إلى كائن آخر، وخاصة إذا كان لديك لتوسيع من النظام نوع من الكائنات مثل مكتبة واجهة مستخدم، يتم الفئات المناسبة على الأرجح.

إذا الذي يتم لا interoperating عن قرب مع التعليمات البرمجية معتمداً على الكائن، أو كتابة التعليمات البرمجية التي هو متكاملا ولذلك محمية من تفاعل متكررة مع التعليمات البرمجية معتمداً على الكائن، يجب استخدام السجلات واتحادات dهوcriminated. discriminated thought–خارج واحدة وجيدا توحيد، مع مطابقة النقش المناسب تعليمات برمجية، يمكن أن تستخدم غالباً كبديل أبسط للتسلسل هرمي لكائن. ل المزيد من المعلومات حول discriminated الاتحادات، راجع الاتحادات discriminated (F#).

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

بني أيضا مفيدة للتجميعات صغيرة من بيانات، ولكن تختلف فئات و السجلات بحيث تكون أنواع القيم.NET. فئات وسجلات يتم.NET مرجع أنواع. دلالات أنواع القيم و تختلف أنواع المرجع في ذلك أنواع القيم التي تم تمريرها حسب القيمة. وهذا يعني أنه يتم نسخها بت بت عندما تكون pكـsed كـ معلمة أو التي يتم إرجاعها من دالة. يتم أيضا تخزين تشغيل المكدس أو، في حالة استخدامها كـ تضمين حقل، داخل الكائن الأصل بدلاً من تخزينها في الموقع منفصل الخاصة بهم في كومة ذاكرة مؤقتة. لذلك، يتم بنية مناسبة للبيانات الوصول إليها بشكل متكرر عند التحميل الزائد للوصول إلى كومة ذاكرة مؤقتة في هو مشكلة. للحصول على مزيد من المعلومات حول بنية، راجع بني (F#).

راجع أيضًا:

المرجع

وراثة (F#)

واجهات (F#)

المبادئ

الأعضاء (F#)

موارد أخرى

مرجع لغة ب #