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