واجهة (برمجة كائنية التوجه)

في البرمجة كائنية التوجه ، يُعد نوع الواجهة أو البروتوكول [ a ] نوع بيانات يعمل كنسخة مجردة من فئة . يصف هذا النوع مجموعة من توقيعات الدوال ، والتي قد تُقدم تطبيقاتها من قِبل فئات متعددة غير مرتبطة بالضرورة ببعضها البعض. [ 1 ] يُقال إن الفئة التي تُقدم الدوال المذكورة في واجهة ما تُنفذ هذه الواجهة، [ 1 ] أو أنها تتبنى البروتوكول. [ 2 ]

تُعدّ الواجهات مفيدةً للتغليف وتقليل الترابط . على سبيل المثال، في لغة جافا ، java.lang.Comparable<T>تُحدّد الواجهة طريقة الفرز compareTo(). وبالتالي، لا تحتاج طريقة الفرز إلا إلى استقبال كائنات من الأنواع التي تُنفّذ java.lang.Comparable<T>هذه الواجهة لفرزها، دون معرفة الطبيعة الداخلية للفئة (باستثناء إمكانية مقارنة اثنين من هذه الكائنات باستخدام واجهة أخرى compareTo()).

أمثلة

توفر بعض لغات البرمجة دعمًا صريحًا للواجهات: Ada و C# و D و Dart و Delphi و Go و Java و Logtalk و Object Pascal و Objective-C و OCaml و PHP و Racket و Swift و Python 3.8. في اللغات التي تدعم الوراثة المتعددة ، مثل C++ ، تكون الواجهات عبارة عن فئات مجردة .

في لغة جافا، قد يبدو تطبيق الواجهات كما يلي:

class Animal { ... } class Theropod extends Animal { ... }واجهة قابلة للطيران { void fly (); }واجهة صوتية { دالة نطق صوتي (); }public class Bird extends Theropod implements Flyable , Vocal { // ... public void fly () { ... } public void vocalize () { ... } }

في اللغات التي لا تدعم الواجهات بشكل صريح، غالبًا ما تكون موجودة كاتفاقيات؛ وهذا ما يُعرف بالكتابة الضمنية . على سبيل المثال، في بايثون ، يمكن لأي فئة تنفيذ __iter__دالة واستخدامها ككائن قابل للتكرار . [ 3 ] كما يمكن للفئات أن ترث صراحةً من فئة أساسية من النوع ABC ، مثل collections.abc.Iterable...

تُستخدم فئات الأنواع في لغات مثل Haskell ، أو توقيعات الوحدات النمطية في ML و OCaml ، للعديد من الأشياء نفسها التي تُستخدم فيها الواجهات.

في لغة Rust ، تُسمى الواجهات بالسمات . [ 4 ] في لغة Rust، structلا تحتوي السمة على طرق، ولكن يمكن إضافة طرق من خلال implكتل منفصلة:

سمة حيوان أليف { دالة التحدث ( & الذات ); }struct Dog { // تحتوي الهياكل فقط على حقولها name : String }impl Dog { // ليس من سمة fn new ( name : String ) -> Self { Dog { name } } }impl Pet for Dog { // من سمة fn speak ( & self ) { println! ( "{} يقول 'نباح!'" , self . name ); } }fn main () { let dog = Dog :: new ( String :: from ( "Arlo" )); dog . speak (); }

في لغة C++، توجد طرق متعددة لمحاكاة الواجهات. إحدى هذه الطرق هي واجهة نمط جافا، والتي تُنفذ باستخدام الفئات المجردة. أما الطريقة الأخرى، والتي تُشبه واجهات لغة جو، فهي استخدام المفاهيم . على عكس الوراثة، مع المفاهيم، يمكن لأي نوع أن يُلبي مفهومًا معينًا (ليس فقط الفئات) طالما أنه يُلبي جميع متطلباته.

انظر أيضاً

ملحوظات

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

مراجع

  1. 1 2 "الواجهات - تحديد السلوك لأنواع متعددة" . learn.microsoft.com . تم الاطلاع عليه بتاريخ 16 نوفمبر 2022 .
  2. ميلر، بي جيه (2015). سامز: تعلم لغة سويفت بنفسك في 24 ساعة . إنديانابوليس، إنديانا. ص 263. ISBN  978-0-672-33724-6يمكن لأي نوع أن يتبنى بروتوكولاً للمساعدة في منحه وظائف إضافية لإنجاز مجموعة معينة من المهام.{{cite book}}: CS1 maint: موقع الناشر مفقود ( رابط )
  3. "مسرد المصطلحات - وثائق بايثون 3.11.0" . docs.python.org . تم الاطلاع عليه بتاريخ 16 نوفمبر 2022 .
  4. "السمات - مرجع الصدأ" . يناير 2024.