‫في هذا الدرس ، ستتعلم كيفية إنشاء واجهاتك الخاصة وتنفيذها باستخدام مثال ملموس ، وستتعرف
‫على سبب استخدام الواجهات ، خاصةً عندما لا يكون لفصولنا علاقة ببعضها البعض وبالتالي لا
‫توجد علاقة بينهما. ر مشاركة فئة أساسية.
‫لذا فإن الميراث في حد ذاته ليس خيارًا.
‫تخيل أننا نعمل على لعبة فيديو حيث يمكن للاعب تدمير الأشياء ، لكن كل شيء ندمره
‫سيكون له سلوك مختلف اعتمادًا على ما تم تدميره.
‫على سبيل المثال ، سيؤدي تدمير كرسي إلى إصدار بعض أصوات الدمار وسيؤدي إلى ظهور أجزاء كرسي مدمرة.
‫لكن تدمير سيارة سيصدر صوت انفجار ، ويخلق حريقًا ويدمر الأشياء الأخرى القريبة.
‫بالنسبة للعبتنا ، لدينا الفصول التالية: كرسي يرث من أثاث الدرجة والسيارة التي
‫ترث من فئة المركبات.
‫لذلك دعونا نلقي نظرة سريعة على هذه الفئات.
‫لذلك لدينا هذا الكرسي الذي يرث من الأثاث ، والكرسي لديه مُنشئ بسيط هنا حيث نضع
‫اللون بالإضافة إلى المادة بناءً على ما يتم إعطاؤه للكائن الذي تم إنشاؤه.
‫لكن الآن ، بالطبع ، هذا الفصل موروث من الأثاث ، ولهذا السبب لدينا تلك الخصائص هنا ،
‫اللون والمواد التي استخدمناها للتو في فصل الكرسي.
‫ثم لدينا المنشئ هنا ، وهو المُنشئ الافتراضي ، حيث سيتم تعيين هذه القيم
‫افتراضيًا.
‫لذا فإن اللون والمواد ستكون بيضاء وخشبية بشكل افتراضي.
‫ثم لدينا أيضًا مُنشئ بسيط يستخدم اللون بالإضافة إلى المادة لتعيينها افتراضيًا.
‫حسنًا ، ليس هناك ما يتخيله ، لكن بالطبع لدينا أيضًا سيارة ونريد أن نكون قادرين على تدمير الكرسي
‫والسيارة ، كما ذكرت سابقًا.
‫لذلك دعونا ننظر إلى السيارة بسرعة حقيقية.
‫إذن لدينا هنا نفس القصة ، سيارة من الفئة الفرعية تمد السيارة حيث نضبط سرعة السيارة بالإضافة
‫إلى اللون.
‫لذلك نحن الآن ، بالمناسبة ، نستخدم مُنشئًا بسيطًا كما نفعل هنا.
‫لكن بالطبع ، كان من الممكن أن نستخدم أساسًا هنا أيضًا ، لتمرير السرعة بالإضافة إلى اللون.
‫لذلك يعد هذا أيضًا خيارًا صالحًا ولن نضطر لاستخدامه هنا.
‫لذلك هناك طريقتان مختلفتان ، بالطبع ، للقيام بذلك.
‫تمام.
‫ثم هذه السيارة موروثة من السيارة حيث يجب بالطبع تحديد السرعة واللون.
‫لذلك دعونا نلقي نظرة على فئة السيارة ويمكننا أن نرى هنا أن هذه السيارة من الفئة الأساسية لها سرعة
‫، ولون ، ومُنشئ افتراضي ، والذي يحدد هاتين القيمتين ، السرعة 120 كيلومترًا في الساعة واللون
‫باللون الأبيض.
‫ثم لدينا المُنشئ البسيط الذي يضبط السرعة واللون بناءً على
‫القيم المعطاة لجسم السيارة.
‫أيضا ، بالطبع ، لتوريث الأشياء مثل السيارة ، على سبيل المثال.
‫تمام.
‫والآن بعد أن أصبح لدينا كل تلك الفئات المختلفة ورأينا كيف يتم هيكلتها ، فلنلقِ نظرة
‫على ميزة التدمير الفعلية.
‫إذن ما هو أفضل نهج لإنشاء ميزة التدمير هذه؟
‫إذا فكرنا في الأمر ، لا يمكننا إضافة فئة لجعل فصولنا ترث منها لأن C-sharp هي
‫لغة وراثة واحدة وليست لغة موروثة متعددة نرثها جميعًا بالفعل من فئة واحدة ، لذلك ترث
‫السيارة بالفعل من السيارة والكرسي يرث بالفعل من الأثاث.
‫لذلك لا يمكن أن ترث من شيء آخر.
‫مثل ، على سبيل المثال ، السيارة هنا ، كما ترى ، لا تسمح C-sharp بهذا لأنه لا يمكن أن تحتوي
‫على فئات أساسية متعددة.
‫لا يمكن أن تحتوي الفئة على فئات أساسية متعددة في C-sharp.
‫بالإضافة إلى أنه لا توجد علاقة ملموسة بين السيارة والكرسي لمشاركة فئة أساسية واحدة على أي حال لأنهما
‫مختلفان تمامًا عن شيئين ، أليس كذلك؟
‫إذا طبقنا طرقًا عادية تسمى طريقة التدمير ، على سبيل المثال ، في كل من تلك الفئات التي لدينا
‫هنا ، فسيكون من الصعب الحفاظ عليها.
‫ماذا لو قررنا تغيير نظام التدمير كليًا أو إضافة تأثيرات بصرية لأجسامنا القابلة للتدمير
‫في المستقبل؟
‫سيكون من المؤلم أن تمر بكل فصل وتعديله.
‫لأنه في هذه الحالة ، لدينا فئتان فرعيتان فقط ، إذا جاز التعبير.
‫الصحيح.
‫لكن تخيل أن لديك 50 أو حتى 100 فئة مختلفة ، 100 نوع مختلف من الأشياء في لعبتك.
‫ثم سيتعين عليك المرور عبر كل واحد منهم وتعديل الكود وفقًا لذلك.
‫لذلك هذا عبء حقًا ولا نريد أن نمر به.
‫لهذا السبب نحتاج إلى إيجاد حل أفضل.
‫ما نحتاجه هو طريقة لفرض سلوكنا الذي يشتت انتباهنا على كل فئة تستخدمه ، تمامًا مثل
‫العقد.
‫وإذا كنت قد شاهدت الفيديو الخاص بنا على الواجهات ، فأنت تعلم أنها عقود يمكننا إنشاؤها.
‫لذا فإن أفضل طريقة في هذه الحالة هي استخدام واجهة وسوف نسميها I Destroy Able.
‫وأي فئة تنفذ هذه الواجهة ستضطر إلى اتباع متطلبات التدمير الخاصة بنا وتخصيصها
‫في نفس الوقت ، اعتمادًا على الفئة نفسها.
‫لذلك دعونا نمضي قدمًا وننشئ مثل هذه الواجهة.
‫لذلك ، يمكنك الانتقال هنا إلى مشروعك ، وإضافة عنصر جديد ، ثم تحديد الواجهة هنا وإعطائها
‫اسمًا.
‫لذلك سأسمي هذا.
‫لقد قمت بتدمير البلي حتى تتمكن من رؤية عند استخدام الواجهات ، يمكنك إضافة I في بداية اسم
‫الملف للإشارة إلى أن هذا سيكون واجهة.
‫لذلك دعونا نضيف هذه الواجهة.
‫لذلك ستحتوي هذه الواجهة فقط على خاصية لتخزين الملف الصوتي الذي سيتم تشغيله بمجرد تنفيذ
‫التدمير ، والذي سيكون صوت التدمير.
‫ومن ثم لدينا طريقة تدمر كائنًا وسنطلق على هذه الطريقة اسم تدمير.
‫لن تعيد أي شيء ، بل ستدمر شيئًا ما.
‫لذلك يمكن ، على سبيل المثال ، إرجاع الرسومات التي لديك.
‫وبالتالي فإن الأشياء التي تريد عرضها بمجرد إتلاف العنصر ، على سبيل المثال ، تحطمت السيارة
‫أو تحطم الكرسي وما إلى ذلك.
‫لذلك دعونا الآن نتأكد من أن فصولنا في الواقع ستنفذ هذه الواجهة ثم بالطبع ننفذ محتوى الواجهات
‫، وهذا يعني صوت التدمير بالإضافة إلى طريقة التدمير.
‫كيف يمكننا فعل ذلك؟
‫حسنًا ، دعنا ننتقل إلى سيارتنا ، على سبيل المثال ، وهنا ستحتاج سيارتنا إلى إضافة فاصلة هنا في الجزء العلوي من تعريف
‫الفصل في الأعلى واستخدام هذا ، سأدمر الواجهة القادرة مثل الآن إذا أضفت ذلك يمكنك رؤيته أن تحصل على خطأ
‫مفاده أن السيارة لا تنفذ صوت تدمير عضو الواجهة بالإضافة إلى تدميرها حتى
‫نتمكن من إظهار الإصلاحات المحتملة وتنفيذ جميع الأعضاء.
‫على سبيل المثال ، سيؤدي هذا إلى إنشاء هذا الرمز التلقائي لنا.
‫لذلك سيخلق الفراغ ، ويدمر ، قادرًا على التدمير وسيخلق صوت تدمير لنا.
‫لذلك سيكون هذا هو الإصدار الذي تم إنشاؤه تلقائيًا ، ولكن يمكننا أيضًا القيام بذلك يدويًا.
‫لا توجد مشكلة في ذلك.
‫لذلك هنا ، على سبيل المثال ، يمكننا تنفيذ صوت التدمير.
‫ثم ما أريد أن أكون قادرًا على فعله هو أنني أرغب في امتلاك خاصية لتخزين الأشياء المدمرة في مكان قريب.
‫لذلك عندما تتدمر سيارة ، يجب أن تدمر أيضًا الجسم القريب.
‫وستكون هذه القائمة أيضًا من النوع.
‫أنا أتلف قادر ، مما يعني أنه يمكنه تخزين أي كائن يقوم بتنفيذ هذه الواجهة ويمكننا فقط الوصول
‫إلى الخصائص والطرق في تلك الواجهة.
‫لذلك من أجل إنشاء ذلك ، سأقوم بإنشاء قائمة عامة بتدمير كل الأشياء وسأسميهم
‫تدمير الكرات القريبة.
‫الآن يمكننا المضي قدمًا وتوسيع المُنشئ الخاص بنا.
‫لذا من ناحية ، نريد التأكد من أننا نبدأ الصوت.
‫لذلك نتأكد من أن لدينا صوت انفجار.
‫على سبيل المثال ، لنفترض أن لدينا هذا الصوت المسمى مكبر صوت انفجار السيارة ثلاثة.
‫ومن ثم نريد تهيئة قائمة تدمير الكائنات القادرة.
‫لذلك ، على سبيل المثال ، سيكون هذا مجرد قائمة جديدة للأشياء المدمرة ، وبعد ذلك نحتاج فقط إلى
‫تنفيذ طريقة التدمير.
‫لذلك هذا أنا تدميره.
‫حسنًا ، هنا في الجزء العلوي ، يمكنك أن ترى أنه لا يزال غير سعيد ، ولا يزال يتوقع منا تنفيذ طريقة
‫التدمير.
‫لذلك ترى عندما تقوم بتنفيذ واجهة تحتاج إلى تنفيذ أعضائها لأن الواجهة هنا
‫بها عضوان ، نحتاج إلى تنفيذ كلاهما.
‫هذا يعني أننا بحاجة إلى العودة إلى هنا ونحتاج بالفعل إلى تنفيذ طريقة التدمير.
‫لذلك دعونا نفعل ذلك بسرعة من أجل القيام بذلك.
‫ما أريد إضافته هنا سيكون ، أولاً وقبل كل شيء ، بيانين.
‫سأستخدم عبارات الخط الصحيح.
‫سأبقي الأمر بسيطًا لأننا لا ننشئ لعبة هنا ، لكننا نحاول فقط فهم
‫مفاهيم الواجهات.
‫لذلك عندما يتم تدمير سيارة ، يجب أن نسمع صوت الدمار ونخلق تأثير النار.
‫لذلك نحن هنا فقط نحاكي كما لو كنا سنشغل الصوت بالفعل وسيقول ، حسنًا
‫، نلعب صوت انفجار السيارة ثلاثة وننشئ النار.
‫لذلك كل شيء تحت النار.
‫كل شيء يحترق لأن السيارة دمرت.
‫لذلك دعونا الآن ننتقل إلى كل شخص ندمر كل ما هو قريب وندمره بالفعل.
‫لذلك نحن هنا في طريقنا لتصفح كل شيء أقوم بتدميره داخل قائمة الكرات المدمرة
‫القريبة.
‫نسميها تدمير كل شيء.
‫لذلك كل عنصر على حدة سيكون كرة محطمة ، وهو في الأساس مجرد اسم متغير محلي.
‫لذلك نقول ، حسنًا ، الكائن المدمر الذي سينفذ واجهة ID Storable سيُطلق عليه فقط تدمير
‫الكرة في كل حلقة.
‫لذلك نحن نكررها ، مما يعني أننا نكرر المجموعة ، ونحطم الكرات القريبة
‫، وهي قائمة بتدمير الأشياء ، وهي في الأساس كائنات تنفذ واجهة ID القابلة للتمدد
‫، ثم نسمي طريقة التدمير.
‫لذلك بشكل أساسي نخلق تفاعلًا متسلسلًا هنا ، حيث ندمر كل شيء حول كل شيء تم تدميره وهذه
‫أيضًا سيارة وما إلى ذلك.
‫في هذه الحالة ، لنفترض أن لدينا سيارتين متجاورتين ولديهما مجموعة من الكراسي بجانب بعضها
‫البعض.
‫لذلك سوف تسمي السيارات طريقة التدمير هذه حيث ستدمر العناصر القريبة لأنها ، حسناً
‫، انفجار ضخم.
‫الصحيح.
‫هناك صوت قادم ويصدر كل عنصر صوتًا.
‫الآن ، يمكنك بالطبع إنشاء عداد الوقت الذي تحتاجه حتى يحدث الانفجار الفعلي بعد اندلاع
‫حريق في شيء ما.
‫لكننا سنبقي الأمر بسيطًا هنا.
‫لذلك نحن ندمر السيارات الأخرى ، ولكن أيضًا الكراسي الأخرى.
‫لذلك ستصيب كل سيارة العناصر الأخرى المجاورة لها.
‫ويمكن أن يكون هذا ، دعنا نقول ، كل شيء على بعد عشرة أمتار أو خمسة أمتار أو على الرغم
‫من عدة بوصات إذا كنت تريد أخذ النظام الأمريكي هنا.
‫لكن هذا ما سيحدث في الأساس.
‫الآن ، دعنا ننظر إلى الكراسي ، لأن الكراسي يجب أن تتبع نهجًا مشابهًا ، لأننا نريد
‫أيضًا التأكد من تدمير الكرسي ، لكن تدمير الكرسي سيكون مختلفًا تمامًا.
‫لذلك سنضيف هنا أيضًا الواجهة.
‫لذا فإنني أقوم بتدمير كل الواجهة وبالطبع نحتاج إلى تنفيذ صوت التدمير وسيكون
‫ذلك دمارًا مختلفًا تمامًا لأن الكرسي سوف يتفكك وسيؤدي إلى تحطيم الخشب الذي تسمعه.
‫لذلك سيكون صوتًا مختلفًا جدًا هنا.
‫وبعد ذلك بالطبع ، نريد تحديد صوت التدمير داخل المُنشئ أيضًا.
‫لذلك سأقول أنه يجب تشغيل صوت تدمير الكرسي.
‫سيكون دائما هو نفسه.
‫لهذا السبب لا أضيفها هنا في إعلان الرئيس.
‫لذلك أبقي الأمر بسيطًا هنا.
‫بالطبع ، يمكن أن يكون لديك كراسي مختلفة لها أصوات انفجار مختلفة.
‫ثم يمكنك إضافته هنا في الجزء العلوي كمعامل للمُنشئ الخاص بك.
‫حسنًا ، دعونا الآن ننفذ طريقة التدمير.
‫وفي هذه الحالة ، ما سيحدث هو أننا سندمر شيئًا ما وسنقوم ، أولاً وقبل كل شيء ، بتدمير الكرسي الملون
‫بناءً على لون الكرسي.
‫سنكتب ذلك ، ثم نلعب صوت الدمار.
‫ثم أخيرًا سنقوم بإنتاج أجزاء كرسي.
‫لذلك في حالتنا نحن فقط نكتبه على وحدة التحكم.
‫لكن تخيل فقط في لعبة حقيقية كيف ستفعل ذلك ، لأن أفضل طريقة لتدمير شيء ما في لعبة فيديو
‫هي عدم القيام بالأمر المادي حيث تفعل كل الدمار ، وهو أمر يصعب
‫بناؤه بشكل خاص كما لو.
‫ليس لديك فريق كبير يقوم بكل أنواع الأشياء.
‫بعد ذلك ، ستقوم فقط بعمل انفجار كبير أو رسوم متحركة للدمار ، ثم تفرخ الأجزاء المدمرة
‫من الأجزاء الفردية الموجودة حولك.
‫لذلك ترى هنا أنه لا يوجد تفاعل متسلسل يأتي من طريقة التدمير هذه.
‫لذا فإن تنفيذ طريقة التدمير للكرسي يختلف تمامًا عن تلك الموجودة في السيارة
‫، لكن كلاهما يرث من واجهة I تدمير القادرة وعليهما تنفيذ طريقة التدمير ويمكنهما القيام بذلك
‫بطريقتهما الخاصة.
‫تسمح لنا الواجهات بشكل أساسي بنوع من الميراث المتعدد ، على الرغم من أنها ليست في الحقيقة توارثًا
‫متعددًا.
‫تمام.
‫الآن دعنا ننتقل إلى برنامجنا ، CSS ، ونستخدم بالفعل فصولنا المنشأة حديثًا لأنه حسنًا ، وإلا
‫فهو ممل ، أليس كذلك؟
‫لذلك دعونا نمضي قدمًا ونصنع كرسيين.
‫إذن لدينا كرسي مكتب سيكون بنيًا وبلاستيكيًا ، ثم لدينا كرسي ألعاب باللون
‫الأحمر والخشب.
‫ثم دعونا أيضًا نصنع سيارة جديدة.
‫لذا فإن سرعة هذه السيارة 80 وستكون زرقاء وستكون سيارة تالفة.
‫ثم نضيف الكرسيين القريبين ، هذه السيارة المتضررة.
‫لذلك قمنا بإضافتها كعجلات مدمرة بالقرب من سيارتنا المتضررة.
‫لذا سيكون كرسي المكتب وكرسي الألعاب الآن ، إذا نظرنا إليه هنا على أنه مدمر ، فهو قريب لأنه عند
‫إنشاء سيارة ، ستكون هذه القائمة فارغة.
‫ولكن بعد ذلك يمكننا بالطبع ، لأنها قائمة عامة هنا ، يمكننا إضافة عناصر إليها ، وهو ما نقوم به.
‫نضيف جميع العناصر المدمرة إليها.
‫ولماذا نضيف الكراسي إلى الكرات المدمرة القريبة؟
‫حسنًا ، لأن الكرسي ينفذ هذه الواجهة.
‫التي نسميها القبلية.
‫هذا يعني أنه سيتم قبول الكرسي الآن ككائن من النوع الذي أتلفه.
‫مما يعني أنه يمكننا الآن إضافته كإزعاج في مكان قريب.
‫الآن يمكننا المضي قدمًا وتدمير السيارة.
‫لذلك دعونا فقط نسمي طريقة التدمير لسيارتنا التالفة حتى يمكن للانفجار أن يشارك.
‫يمكن أن يبدأ صوت الانفجار وجميع الأشياء الجيدة.
‫لذلك دعونا نجري هذا.
‫وبالطبع ، ستكون هذه لعبة مغامرة وليست لعبة حيث ترى رسومات ثلاثية الأبعاد فعلية
‫أو أي شيء.
‫لذلك نقوم بتشغيل صوت الدمار ، صوت انفجار السيارة ، نشعل النار.
‫تم تدمير الكرسي البني.
‫نقوم بتشغيل صوت تدمير الكرسي بصوت التدمير ثلاثة.
‫ثم نقوم بتفريخ أجزاء الكرسي لكرسينا البني.
‫ثم تم تدمير الكرسي الأحمر.
‫نحن نلعب صوت تدمير الكرسي ، مضخم الصوت الثالث ، ثم نفرخ أجزاء
‫كرسي لكرسينا الأحمر.
‫لذلك كما ترى ، هذا كل شيء إلى حد كبير.
‫هكذا يمكنك إنشاء واجهاتك الخاصة وكيف يمكنك استخدامها.
‫وآمل أن تكون قد فهمت الآن ما يمكن أن تفعله الواجهات من أجلك ومزايا الواجهات.
‫لذلك يتم استخدام ملاحظة مهمة هنا عن طريق الواجهات للاتصال بين فئتين متشابهتين أو
‫غير متشابهتين لا تهتمان بنوع الفئة التي تنفذ الواجهة.
‫تمامًا مثل الطريقة التي تواصلت بها سيارتنا مع الكرسي لاستدعاء طريقة التدمير ، كل ذلك لأنهم قاموا للتو
‫بتطبيق نفس الواجهة كما ذكرت سابقًا.
‫لذا ، بينما قد يبدو من الصعب فهم الواجهات للوهلة الأولى ، فإنها توفر لنا امتيازات رائعة.
‫هذه الامتيازات هي قابلية قراءة الكود.
‫لذا فإن الواجهة تشكل إعلانًا عن النوايا ، لذا فهي تحدد قدرة فصلك.
‫إذن ما يمكن لفصلك القيام به ، إذا قمت بتطبيق AI قابل للفرز ، على سبيل المثال ،
‫فأنت تعلن بوضوح أنه يمكن فرز كائنات فصلك ثم دلالات الكود.
‫من خلال توفير الواجهات وتنفيذها ، فأنت تقوم بفصل المفاهيم والواجهة بشكل نشط وتحدد نموذجًا
‫سلوكيًا ، وتعريف ما يمكن أن يفعله الكائن والفصل بين هذه المفاهيم يبقي دلالات الكود الخاص بك
‫أكثر وضوحًا.
‫ثم لديك الرمز.
‫تساعد واجهات قابلية الصيانة على تقليل الاقتران وتسمح لك بتبادل التطبيقات بسهولة
‫لنفس المفهوم دون أن يتأثر الكود الأساسي.
‫ومن ثم لدينا أنماط التصميم.
‫إنها الصورة الأكبر لاستخدام العقود والتجريد والواجهات المحورية للبرمجة الموجهة للكائنات
‫، وبالتالي فهم الإنسان وبنية النظام المعقدة.
‫لذلك ، من الضروري أن نفهمه بشكل أفضل كإنسان ثم تعدد الميراث.
‫لذلك يمكن أن تكون الواجهات هي بوابتنا لاستخدام الوراثة المتعددة في C-sharp.
‫لذا افترض أنك تكتب مكتبة وتريد أن تكون قابلة للتعديل من قبل المستخدمين.
‫أنت تكتب الواجهة وتنفيذ فئتها.
‫لا يزال بإمكان المطورين الآخرين الذين سيستخدمون مكتبتك كتابة فئة التنفيذ الخاصة
‫بهم ، والتي قد تستخدم تقنيات أو خوارزميات مختلفة تحقق نفس النتيجة.
‫هذا هو السبب أيضًا في أننا نلتقي بالعديد من الواجهات في المكتبات التي نستخدمها ، ولكن نادرًا ما نشعر
‫بالحاجة إلى كتابة واجهاتنا الخاصة لأننا لا نكتب المكتبات بأنفسنا.
‫في ملاحظة أخيرة ، الشيء المهم هو فهم كيفية تنفيذ الواجهات في هذه المرحلة.
‫بالطبع ، نحن نمر عبر تقنيات مختلفة مثل WPF و ASP. NET و C من الفئة الرئيسية الحادة ، سنبدأ
‫في استخدام الواجهات بشكل أكبر ، مما سيساعدك على فهمها بشكل أفضل في المستقبل.
‫حسنا.
‫لذا شكرا جزيلا لمشاهدة هذا الفيديو.
‫نراكم في القادم.