Dart / العقود: الأنماط والواجهات العامة والنتائج غير المتزامنة / الدرس 10
اختيار حدود الواجهات وmixins والامتدادات الثابتة
ميّز وراثة التنفيذ وعقود الواجهات وسلوك mixin القابل لإعادة الاستخدام واختيار الامتداد وفق حدود مكتبات Dart.
في هذه الصفحة
أهداف الدرس
- اختر معدل الصنف وفقا لحقوق الامتداد والتنفيذ التي تقصد الواجهة إتاحتها.
- اشرح لماذا لا يمثل الامتداد تجاوزا افتراضيا، ولماذا لا يمنح mixin ملكية مورد تلقائيا.
تصف المعدلات الحقوق عبر حد المكتبة
يعرض صنف Dart عادة واجهة ضمنية، فيختلف الامتداد عن التنفيذ كطريقتين للاعتماد عليه. توضح معدلات Dart 3 الحقوق المقصودة. تصف abstract interface class عقدا لا يُنشأ مباشرة ويمكن تنفيذه خارج مكتبته. تمنع interface الامتداد الخارجي، وتمنع final الامتداد والتنفيذ الخارجيين، وتفرض base وراثة التنفيذ بدلا من التنفيذ الخارجي مع قواعد لمعدلات الأنواع الفرعية. وتقيّد sealed البدائل المباشرة بمكتبتها. اقرأ تركيب المعدلات بدقة؛ فلا تعني final ثبات كل الحقول، ولا تتطابق القيود بالضرورة داخل المكتبة وخارجها.
أعد استخدام سلوك متماسك بأعضاء مطلوبة صراحة
يوفر mixin سلوك مثيل قابلا لإعادة الاستخدام دون أن يكون صنفا عاديا ذا منشئ توليدي. يمكنه إعلان أعضاء مجردة يوفرها الصنف المستخدم له، ويمكن لقيد on اشتراط صنف أعلى مناسب عند الحاجة. يتطلب المثال getter للمعرف ويشتق منه عنوانا، وينفذ واجهة صغيرة كي تبقى القدرة والتنفيذ المعاد استخدامه متميزين. تجنب mixin كبيرا كحقيبة خفية لحالة وعمليات غير مترابطة. راجع تعارض الطرق وترتيب التطبيق والاعتماديات قبل جمع عدة mixins في صنف واحد.
abstract interface class BatchInfo {
String get id;
}
mixin Captioned {
String get id;
String get caption => 'batch:$id';
}
final class DisplayBatch with Captioned implements BatchInfo {
@override
final String id;
DisplayBatch(this.id);
}
void main() {
final batch = DisplayBatch('B-7');
print(batch.id);
print(batch.caption);
}
B-7
batch:B-7
المخرج المتوقع B-7 ثم batch:B-7. يوفر حقل final دالة القراءة المطلوبة. تلزم معدلات Dart 3، ولم يُجر اختبار ترجمة أو تشغيل.
لا تحسم الوراثة وإعادة الاستخدام سياسة العمر
يظل mixin الذي يستدعي سجلا معتمدا على سلوكه، ولا تحدد واجهة تذكر close مالك المورد. وثّق هل يغلق المستدعي الاعتمادية أم الكائن، وما قد يفشل، وهل تحجب الطرق أو تجدول عملا غير متزامن. فضّل التركيب عندما يستخدم الكائن قدرة فقط، لا حين يحقق عقد استبدال حقيقيا. يوفر تنفيذ الواجهة الضمنية الأعضاء المطلوبة دون وراثة التخزين الخاص أو أجسام الطرق. لا ينبغي أن يخفي الاختصار معنى مختلفا خلف اسم طريقة مألوف.
يعتمد اختيار الامتداد على نوع المستقبل الساكن
يتيح الامتداد دوال بصياغة تشبه الأعضاء دون تعديل الصنف الأصلي. لا يكتسب وصولا خاصا لمكتبة أخرى لمجرد شبه الاستدعاء بالعضو. تُحسم الامتدادات ساكنا، ولا يكتشفها مستقبل dynamic كأعضاء تشغيل. ويتقدم العضو المناسب على الامتداد. يمرر المثال SpecialMarker إلى معامل Marker، فتختار الدالة امتداد Marker. إذا وجب اختلاف السلوك بحسب النوع التشغيلي، فاستخدم عقد مثيل حقيقيا مع تجاوز، ولا تتوقع من الامتدادات اختيارا افتراضيا.
class Marker {}
class SpecialMarker extends Marker {}
extension MarkerLabel on Marker {
String get label => 'base extension';
}
extension SpecialLabel on SpecialMarker {
String get label => 'special extension';
}
String readLabel(Marker value) => value.label;
void main() {
print(readLabel(SpecialMarker()));
print(SpecialMarker().label);
}
base extension
special extension
المخرج المتوقع base extension ثم special extension. لا يحدد نوع الكائن وحده الامتداد الأول. المصدر كامل توضيحي وغير مترجم.
راجع الاستيرادات وتعارض الامتدادات كتغييرات واجهة
قد تجعل امتدادات مستوردة متنافسة الاستدعاء ملتبسا، وقد يغير عضو جديد التصريح المختار. يمكن لاستدعاء امتداد باسمه أو ضبط الاستيراد توضيح القصد. لا تخف إدخالا وإخراجا شبكيا أو تعديلا متلفا خلف getter تبدو بسيطة. وثّق الآثار وتحقق من المدخل واختر اسما يوضح إنشاء القيمة أو تعديل المالك. وعند تطوير الواجهة، راجع المنفذين والممتدين الخارجيين وفق عقد المعدلات. قد يعمل تغيير داخل مكتبة ويكسر مكتبات تابعة ذات حقوق مختلفة.
الأخطاء الشائعة وإصلاحها
يُفترض أن final class تجعل كل مثيل ثابتا بعمق.
- لماذا يحدث؟
- اختلطت قيود الأنواع الفرعية بتعديل الحقول والكائنات.
- كيف تصلحه؟
- راجع تعديل الحقول والملكية الداخلية بصورة مستقلة.
- كيف تتجنب تكراره؟
- اذكر الضمان الدقيق لكل معدل صنف.
لا يستطيع مستقبل dynamic استدعاء مساعد الامتداد المتوقع.
- لماذا يحدث؟
- اختلط اختيار الامتداد الساكن باستدعاء عضو وقت التشغيل.
- كيف تصلحه؟
- استخدم نوعا ساكنا معروفا أو واجهة مثيل حقيقية حسب الحاجة.
- كيف تتجنب تكراره؟
- افحص المستدعي عند نوع المستقبل المعلن فعليا.
يعتمد mixin بصمت على قدرة غير متاحة.
- لماذا يحدث؟
- تُركت الأعضاء المطلوبة أو قيود الصنف الأعلى ضمنية.
- كيف تصلحه؟
- صرّح بالمطلب أو مرّر الاعتمادية عبر التركيب.
- كيف تتجنب تكراره؟
- راجع آثار كل سلوك معاد الاستخدام واحتياجات عمره.
اختبر فهمك
1. هل ينفذ عميل خارجي صنفا base لمجرد قدرته على سرد طرقه العامة؟
اعرض الحل المشروح
لا. يقيّد المعدل التنفيذ الخارجي عمدا ويحفظ ضمانات وراثة التنفيذ. اختر مسار الامتداد المدعوم أو اعتمد واجهة يسمح تنفيذها صراحة. لا تمنح مطابقة التواقيع حقوقا حجبها صاحب المكتبة، وقد تتجاوز افتراضات يحافظ عليها التنفيذ الأساسي.
2. لماذا لا يصلح امتداد ساكن بديلا جيدا لمنسق متعدد الأشكال؟
اعرض الحل المشروح
يتبع اختياره نوع المستقبل المعلن والاستيرادات، فقد يختار معامل واسع سلوكا مختلفا عما يوحي به نوع الكائن. يجب أن يعرض المنسق المتغير بالتنفيذ عملية مثيل أو استراتيجية منسق محقونة مستقلة. استخدم الامتدادات للراحة المحلية الواضحة مع حفظ عقد السلوك الحقيقي.
أهم ما تعلمته
- تضبط معدلات الأصناف وmixins والامتدادات جوانب مختلفة من الواجهة.
- لا تنشئ صياغة إعادة الاستخدام ملكية أو ثباتا أو سلوكا افتراضيا تلقائيا.