واجهات (F#)

الواجهات تحديد مجموعات الأعضاء ذات صلة غير ذلك فئات تطبيق.

// Interface declaration:
[ attributes ]
type interface-name =
   [ interface ]
     abstract member1 : [ argument-types1 -> ] return-type1
     abstract member2 : [ argument-types2 -> ] return-type2
     ...
   [ end ]

// Implementing, inside a class type definition:
interface interface-name with
   member self-identifier.member1 argument-list = method-body1
   member self-identifier.member2 argument-list = method-body2

// Implementing, by using an object expression:
[ attributes ]
let class-name (argument-list) =
   { new interface-name with
       member self-identifier.member1 argument-list = method-body1
       member self-identifier.member2 argument-list = method-body2
       [ base-interface-definitions ]
   }
   member-list

ملاحظات

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

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

الكلمات الأساسية interfaceو end، وضع علامة بداية ونهاية التعريف، تكون اختيارية عند لك استخدم بناء جملة خفيفة. إذا كنت لا تستخدم الكلمات الأساسية هذه، المحول البرمجي يحاول الاستدلال ما إذا كان النوع هو فئة أو واجهة ب‏‏يتم الآن التحليل? بنيات التي تستخدمها. إذا قمت بتعريف عضو أو استخدم بناء الجملة "فئة غير ذلك، النوع هو تفسير كفئة.

.NET النمط الترميز هو لبدء الجميع الواجهات مع رأس المال I.

تنفيذ الواجهات باستخدام أنواع فئة

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

type IPrintable =
   abstract member Print : unit -> unit

type SomeClass1(x: int, y: float) =
   interface IPrintable with
      member this.Print() = printfn "%d %f" x y

تطبيقات واجهة موروثة، لذا لا تحتاج أي الفئات المشتقة إلى reimplement لهم.

استدعاء وظائف واجهة

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

استدعاء أسلوب الواجهة في حالة وجود كائن من نوع SomeClass، يجب أن upcast الكائن إلى نوع الواجهة، كما هو موضح فيما يلي تعليمات برمجية.

let x1 = new SomeClass1(1, 2.0)
(x1 :> IPrintable).Print()

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

type SomeClass2(x: int, y: float) =
   member this.Print() = (this :> IPrintable).Print()
   interface IPrintable with
      member this.Print() = printfn "%d %f" x y

let x2 = new SomeClass2(1, 2.0)
x2.Print()

قم بتنفيذ واجهات باستخدام التعبيرات كائن

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

let makePrintable(x: int, y: float) =
    { new IPrintable with
              member this.Print() = printfn "%d %f" x y }
let x3 = makePrintable(1, 2.0) 
x3.Print()

راجع أيضًا:

المرجع

كائن تعبيرات (F#)

الفئات (F#)

موارد أخرى

مرجع لغة ب #