تصف هذه المقالة استخدام واجهات Java والفصول التجريدية. شاركه للرجوع إليه ، على النحو التالي:
واجهة
1 نظرًا لأن Java لا يدعم الميراث المتعدد ، مع واجهات ، يمكن للفئة أن ترث فئة الوالدين واحدة فقط ، ولكن يمكنها تنفيذ واجهات متعددة ، ويمكن للواجهة نفسها أيضًا أن ترث واجهات متعددة.
2 متغيرات الأعضاء في الواجهة هي من النوع النهائي الثابت بشكل افتراضي. التهيئة التي يجب عرضها.
3 الأساليب في الواجهة هي المجردة العامة بشكل افتراضي. إعلان ضمني.
4 الواجهة ليس لها مُنشئ ولا يمكن إنشاء مثيل لها.
5 لا يمكن للواجهة تنفيذ واجهة أخرى ، ولكن يمكن أن ترث واجهات متعددة.
6 إذا قام الفصل بتنشيط واجهة ، فيجب تنفيذ جميع الأساليب المجردة في الواجهة ، وإلا يجب تعريف الفصل على أنه فئة مجردة.
فئة مجردة
1 إذا تم الإعلان عن فئة مجردة ، فإن هذه الفئة لا يمكن أن تنشئ كائنات ولا يمكن استخدامها إلا الموروثة.
2 يجب أن توجد طرق مجردة في الفصول التجريدية.
3 يمكن أن يكون هناك متغيرات عامة وطرق عامة في الفصول التجريدية.
4 فئات فرعية ترث فئة مجردة يجب أن تنفذ أساليبها التجريدية ما لم تكن الفئة الفرعية فئة مجردة.
private void print () {} ؛ يمثل هذا البيان التنفيذ الفارغ للطريقة.
مجردة void print () ؛ يمثل هذا البيان تجريد الطريقة ، دون تنفيذ.
الفرق بين الواجهة والفئة التجريدية
1 يمكن أن تحتوي الواجهة فقط على طرق مجردة ، ويمكن أن تحتوي الفئات المجردة على طرق عادية.
2 يمكن للواجهة تحديد خصائص ثابتة ثابتة فقط. يمكن أن تحدد الفئات المجردة كل من الخصائص العادية والخصائص الثابتة الثابتة.
3 لا تحتوي الواجهة على طرق مُنشأة ، ويمكن أن تحتوي الفئات المجردة على طرق مُنشأة.
لا يمكن إنشاء فئة مجردة ، ولكن لا يعني أنه لا يمكن أن يكون لها مُنشئ. يمكن أن يكون للطبقة التجريدية مُنشئًا ، وهو فئة بديلة.
1 الواجهة هي الأساسية ، التي تحدد ما يجب القيام به ويحتوي على العديد من الطرق ، ولكن لا تحدد كيفية القيام بهذه الطرق.
2 إذا قامت العديد من الفئات بتطبيق واجهة ، فإن كل منها يحتاج إلى تنفيذ هذه الأساليب في الكود.
3 إذا كان لدى تطبيقات بعض الفئات شيء مشترك ، فيمكن استخلاص فئة مجردة للسماح للفئة التجريدية بتنفيذ الكود الشائع للواجهة ، بينما يتم تنفيذ تلك الأساليب المخصصة بواسطة كل فئة فرعية.
لذلك ، تم تصميم الفصول التجريدية لتبسيط تنفيذ الواجهات. إنهم لا يوفرون فقط تنفيذ الأساليب العامة ، مما يسمح لك بالتطوير بسرعة ، ولكن أيضًا يسمحون للفصول الدراسية بتنفيذ جميع الأساليب بأنفسهم دون مشاكل اقتران ضيقة.
التطبيق بسيط للغاية
1. تحديد الواجهات أولاً
2 إذا كانت هناك تطبيقات متعددة للواجهة لها أجزاء مشتركة ، فاستخدم فئات مجردة ودمجها.
يعتقد الفرق بين الواجهة والفئة الأولى المجردة أنه لن يتم الخلط بينه بعد قراءته
أعتقد أنه بالنسبة للمبرمجين الذين يستخدمون لغات البرمجة الموجهة نحو الكائن ، يجب أن يكون مصطلح "واجهة" مألوفًا ، لكنني أتساءل عما إذا كان لديك مثل هذه الشكوك: ما هو الغرض من الواجهة؟ ما هو الفرق بينه وبين الطبقات المجردة؟ هل يمكن استخدام الفصول التجريدية بدلاً من الواجهات؟ علاوة على ذلك ، كمبرمجين ، يجب أن تسمع غالبًا عبارة "برمجة موجهة للواجهة" ، فماذا يعني ذلك؟ ما هو الدلالة الأيديولوجية؟ ما هي العلاقة مع البرمجة الموجهة للكائن؟ سيجيب هذا المقال على هذه الأسئلة واحدة تلو الأخرى.
1. ما هي العلاقة بين البرمجة الموجهة للواجهة والبرمجة الموجهة للكائنات
بادئ ذي بدء ، فإن البرمجة الموجهة للواجهة والبرمجة الموجهة للكائنات ليست أفقية. إنها ليست فكرة برمجة مستقلة أكثر تقدماً من البرمجة الموجهة للكائنات ، ولكنها مرتبطة بنظام التفكير الموجهة للكائنات وينتمي إلى دوره. بمعنى آخر ، إنه أحد جوهر الفكر في أنظمة البرمجة الموجهة للكائنات.
2. طبيعة الواجهة
الواجهة هي ظاهريًا تتكون من عدة تعريفات للطريقة بدون رمز الجسم. إنه له اسم فريد ويمكن تنفيذه بواسطة فئة أو واجهة أخرى (أو يمكن القول أيضًا بأنها موروثة). قد يبدو ما يلي في النموذج:
واجهة interfacename {void method1 () ؛ طريقة void 2 (int para1) ؛ طريقة void 3 (سلسلة para2 ، سلسلة para3) ؛ }إذن ، ما هو جوهر الواجهة؟ أو ما معنى وجود واجهة؟ أعتقد أنه يمكن اعتباره من المنظورين التاليين:
1) الواجهة هي مجموعة من القواعد التي تحدد مجموعة من القواعد التي يجب أن تحتوي عليها فئة أو واجهة تنفذ هذه الواجهة. يجسد مفهوم الطبيعة "إذا كنت ... يجب أن تكون قادرًا على ..."
على سبيل المثال ، في الطبيعة ، يمكن للناس أن يأكلوا ، أي "إذا كنت بشرًا ، فيجب أن تكون قادرًا على تناول الطعام". ثم عند محاكاة برنامج الكمبيوتر ، يجب أن يكون هناك iperson (بشكل أساسي ، يبدأ اسم الواجهة بواجهة "i") ، وهناك طريقة تسمى EAT (). ثم ننص على أن كل فئة تمثل "الإنسان" يجب أن تنفذ واجهة Iperson ، والتي تحاكي القاعدة الطبيعية لـ "إذا كنت إنسانًا ، فيجب أن تكون قادرًا على تناول الطعام".
من هنا ، أعتقد أنه يمكنك أيضًا رؤية بعض الأفكار الموجهة للكائنات. أحد نوى التفكير الموجهة نحو الكائن هو محاكاة العالم الحقيقي والأشياء المجردة في العالم الحقيقي إلى فئات. يعتمد البرنامج بأكمله على مثيلات من أنواع مختلفة للتواصل مع بعضها البعض والتعاون مع بعضها البعض لإكمال وظائف النظام. هذا يتماشى تمامًا مع ظروف التشغيل في العالم الحقيقي وهو أيضًا جوهر التفكير الموجهة للكائن.
2) واجهات هي تمثيلات مجردة لأشياء مماثلة على عرض حبيبات معين. لاحظ أنه هنا أؤكد على وجهة نظر معينة ، لأن مفهوم "نفس الشيء" نسبي ، ويختلف بسبب وجهات النظر الحبيبية المختلفة.
على سبيل المثال ، في عيني ، أنا شخص ، وهناك فرق أساسي بيني وبين الخنزير. يمكنني قبول البيان الذي مفاده أن زملائي في الفصل الدراسي وأنا متماثلون ، لكن لا يجب أن أقبل أنني نفس الخنزير. ومع ذلك ، إذا كانت عيون عالم الحيوان مثل الخنازير ، فيجب أن أكون متماثلاً ، لأننا كلاهما حيوان ، فيمكنه أن يعتقد أن كلا من "الإنسان" و "الخنزير" قد نفذوا الواجهة Ianimal. عندما يدرس سلوك الحيوانات ، لن يعاملني والخنازير بشكل منفصل ، لكنه سيدرسه من حجم الجسيمات الأكبر لـ "حيوان" ، لكنه يعتقد أن هناك فرقًا أساسيًا بيني وبين الشجرة.
الآن بعد أن تحولت إلى عالم وراثي ، فإن الوضع مختلف. نظرًا لأن جميع الكائنات الحية يمكن أن تورث ، في عينيه ، لا أختلف فقط عن الخنازير ، ولكن أيضًا من البعوض أو البكتيريا أو الشجرة أو الفطر أو حتى فيروس السارس ، لأنه يعتقد أننا جميعًا قد نفذنا الواجهة القابلة للتعبئة (ملاحظة: Descend Vi. لن يدرسنا بشكل منفصل ، لكنه سيدرس جميع الكائنات الحية كنوع مماثل. في عينيه ، لا يوجد فرق بين البشر والفيروسات ، والمواد الوراثية فقط والمواد غير القابلة للإنشاء. ولكن على الأقل ، لا يزال هناك فرق بيني وبين الحجر.
لكن لسوء الحظ ، في يوم من الأيام ، ظهر رجل عظيم على الأرض ، يدعى لينين. بعد أن كان على دراية بـ Max و Engels من المادية الجدلية ، كان لديه الكثير من الخبرة ، لذلك أعطى تعريفًا مشهورًا: ما يسمى بالمادة هو حقيقة موضوعية يمكن أن تنعكس عليها الوعي. في هذه المرحلة ، لم أعد مختلفًا عن الحجر ، وتتبع الهواء ، والتعبير ، والمجال الكهرومغناطيسي الذي ينقل إشارات الهاتف المحمول ، لأننا في عيون لينين ، نحن جميعًا حقيقة موضوعية يمكن أن تنعكس عليها الوعي. إذا كان لينين مبرمجًا ، فقد يقول هذا: ما يسمى بالمادة هي الحالات التي تم إنشاؤها بواسطة جميع الفئات التي تنفذ الواجهتين "Ireflectabe" و "Iesse". (ملاحظة: تعكس ضد.
ربما تعتقد أن مثالي أعلاه هو هراء ، ولكن هذا هو بالضبط معنى الواجهة. واحدة من الأفكار الموجهة نحو الكائن والأساسي هو تعدد الأشكال. ما هو تعدد الأشكال؟ بعبارة صريحة ، هو التعامل مع الأشياء المماثلة بشكل عشوائي على مستوى عرض حبيبي معين والتعامل معها بشكل موحد. والسبب في أنني أجرؤ على القيام بذلك هو أن هناك واجهة. مثل هذا الوراثة ، فهم أن جميع الكائنات الحية قد نفذت الواجهة القابلة للتعبير. طالما أنها كائنات حية ، يجب أن تكون هناك طريقة DevCend () ، حتى يتمكن من دراستها بطريقة موحدة دون دراسة كل كائن حسي بشكل منفصل وفي النهاية مرهق.
ربما لا يمكننا أن نعطيك انطباعًا بديهيًا عن طبيعة الواجهة ووظيفة الواجهة. ثم في الأمثلة التالية وتحليل العديد من أنماط التصميم ، سوف تواجه دلالة الواجهة بشكل أكثر حدًا.
3. ملخص البرمجة الموجهة للواجهة
من خلال المقالة أعلاه ، أعتقد أن لديك فهمًا للدعم الأيديولوجي للواجهات والواجهات. إذن ما هي البرمجة الموجهة نحو الواجهة؟ تعريفي الشخصي هو: في تحليل النظام والهندسة المعمارية ، نميز التسلسلات الهرمية والتبعيات. لا يوفر كل مستوى مباشرة خدمات لطبقته العلوية (أي ، لا تم إنشاء مثيل لها مباشرة في الطبقة العليا) ، ولكن بدلاً من ذلك يحدد مجموعة من الواجهات ، فقط تعرض وظائف الواجهة إلى الطبقة العليا. تعتمد الطبقة العليا فقط على الطبقة السفلية ، ولا تعتمد على فئات محددة.
فوائد القيام بذلك واضحة ، وقبل كل شيء ، من المفيد للغاية مرونة النظام. عندما تحتاج الطبقة السفلية إلى تغيير ، طالما تظل وظائف الواجهة والواجهة دون تغيير ، فإن الطبقة العليا لا تحتاج إلى إجراء أي تعديلات. يمكنك حتى استبدال الطبقة السفلية دون تغيير رمز الطبقة العليا ، تمامًا مثل استبدال محرك الأقراص الصلبة WD 60G بمحرك Seagate 160G الصلب. ليست هناك حاجة لإجراء أي تغييرات في أجزاء أخرى من الكمبيوتر ، ولكن فقط قم بفصل محرك الأقراص الثابتة الأصلية وتوصيل محرك الأقراص الثابتة الجديدة ، لأن الأجزاء الأخرى من الكمبيوتر لا تعتمد على محرك الأقراص الثابتة المحددة ، ولكنها تعتمد فقط على واجهة IDE. طالما أن محرك الأقراص الثابتة ينفذ هذه الواجهة ، يمكن استبداله. من هنا ، تشبه الواجهة في البرنامج الواجهة في الواقع ، لذلك اعتقدت دائمًا أن واجهة Word متشابهة حقًا!
ميزة أخرى لاستخدام الواجهات هي أن مطوري المكونات أو المستويات المختلفة يمكن أن يبدأوا في البناء بالتوازي ، تمامًا مثل أولئك الذين يبنون الأقراص الصلبة لا يحتاجون إلى إنشاء وحدات المعالجة المركزية أو المراقبة. طالما أن الواجهات متسقة والتصميم معقول ، يمكن تنفيذ التطوير بالتوازي ، وبالتالي تحسين الكفاءة.
سيأتي هذا المقال هنا أولاً. أخيرًا ، أود أن أقول شيئًا آخر: جوهر الموجهة نحو الكائن هو محاكاة الواقع ، والذي يمكن أيضًا أن يقال إنه روح مقالتي. لذلك ، فإن التفكير في المزيد حول الأشياء الموجهة للكائنات من الواقع سيكون ذا فائدة كبيرة لتحسين قدرات النظام وقدرات التصميم.
في المقالة التالية ، سأستخدم مثالًا لإظهار الأساليب الأساسية لبرمجة الواجهة.
في المقالة الثالثة ، سأقوم بتحليل بعض أفكار البرمجة الموجهة نحو الواجهة في نمط التصميم الكلاسيكي وتحليل الأفكار الموجهة نحو الواجهة في بنية .NET الهرمية.
ملحق لهذه المقالة:
بعد قراءة ردودك بعناية ، يسعدني جدًا مناقشة المشكلات التقنية معك. شكراً لأصدقائك الذين قدموا تأكيدًا ، وأيضًا لأصدقائك الذين طرحوا الآراء والأسئلة ، مما دفعني إلى التفكير بعمق في شيء ما والأمل في إحراز تقدم من خلال هذا. أود هنا إضافة شيء لمناقشة بعض القضايا الأكثر تركيزًا في الردود.
1. فيما يتعلق بكلمتين "واجهة" في "البرمجة الموجهة للواجهة" واللغة المحددة الموجهة للكائنات "واجهة"
رأيت صديقًا يقترح أن كلمة "واجهة" في "البرمجة الموجهة للواجهة" يجب أن تحتوي على نطاق أكبر من الواجهة بلغة برمجة بسيطة. بعد التفكير في الأمر ، اعتقدت أنه من المنطقي. ما كتبته هنا غير معقول حقًا. أعتقد أن "الواجهة" باللغة الموجهة للكائنات تشير إلى بنية رمز محددة ، مثل الواجهة المحددة في C# مع الكلمة الرئيسية للواجهة. يمكن القول أن "الواجهة" في "البرمجة الموجهة للواجهة" هي عنصر هيكلي يشير إلى مستوى أكثر تجريدية من منظور بنية البرمجيات ومن مستوى أكثر تجريدًا. وبهذا المعنى ، إذا تم تحديد فئة مجردة والغرض من ذلك هو تحقيق تعدد الأشكال ، فأعتقد أنه من المعقول تسمية هذه الفئة التجريدية أيضًا "واجهة". ولكن هل من المعقول استخدام فئات مجردة لتنفيذ تعدد الأشكال؟ ناقش في المقالة الثانية أدناه.
باختصار ، أعتقد أن مفاهيم "واجهات" مختلفة على حد سواء وتتعلق ببعضها البعض. الواجهات في "البرمجة الموجهة للواجهة" هي مكونات معمارية على المستوى الأيديولوجي لتحقيق تعدد الأشكال ، وتحسين مرونة البرامج وقابليتها للصيانة ، في حين أن "الواجهات" بلغات محددة هي وسيلة لتنفيذ المكونات في هذه الفكرة.
2. حول الفصول التجريدية والواجهات
رأيت أن هذه كانت مشكلة أكثر كثافة في الرد. آسف ، لم أكن أفكر جيدًا في هذه القضية في المقال. ما يلي فهمي الشخصي لهذه القضية على النحو التالي:
إذا نظرنا إلى الكود المحدد وحده ، من السهل أن تكون هذين المفهومين غير واضحة ، وحتى نعتقد أن الواجهة زائدة عن الحاجة ، لأنه من الوظيفة المحددة وحدها ، باستثناء الميراث المتعدد (C#، في Java) ، يبدو أن الفئات المجردة قادرة على استبدال الواجهات تمامًا. ومع ذلك ، هل وجود واجهات لتحقيق الميراث المتعدد؟ بالطبع لا. أعتقد أن الفرق بين الطبقات المجردة والواجهات هو الدافع للاستخدام. استخدام الفئات المجردة مخصص لإعادة استخدام التعليمات البرمجية ، في حين أن الدافع لاستخدام واجهات هو تعدد الأشكال. لذا ، إذا كنت تتردد في استخدام واجهة أو فئة مجردة في مكان ما ، فيمكنك التفكير في ماهية دوافعك.
عند رؤية شكوك صديق حول واجهة Iperson ، فإن فهمي الشخصي هو أن ما إذا كان ينبغي تعريف واجهة Iperson محددة على التطبيق المحدد. إذا كانت هناك نساء ورجل في مشروعنا ، فإن كلاهما يرث الشخص ، ومعظم أساليب النساء والإنسان متماثلان ، وهناك طريقة واحدة فقط ، فإن dosomethingInwc () مختلفة (المثال مبتذلة ، يرجى أن تسامحني) ، ثم بالطبع ، من المعقول أن تحدد المجردة المجردة.
ومع ذلك ، إذا لم يكن لدى النساء والرجلات في برنامجنا رمزًا مشتركًا بشكل أساسي ، وهناك فئة ProfireLysh التي تحتاج إلى إنشاء مثيل لها ، ولا ترغب في معرفة ما إذا كانوا رجالًا أو نساء ، ولكن فقط تعاملهم كبشر وتنفيذ تعدد الأشكال ، فمن الضروري تحديدها كواجهة.
باختصار ، يرجع الفرق بين الواجهة والفئة المجردة بشكل رئيسي إلى الدافع للاستخدام ، وليس نفسه. عندما يجب تعريف أي شيء على أنه فئة مجردة أو واجهة ، يجب تحديده بناءً على سياق البيئة المحددة.
علاوة على ذلك ، أعتقد أن هناك اختلافًا آخر بين الواجهة والفئة المجردة هو أنه يجب أن تكون هناك علاقة عامة وخاصة بين فئة مجردة وفئاته الفرعية ، في حين أن الواجهة مجرد مجموعة من القواعد التي يجب أن تنفذها فئة الفرعية. (بالطبع ، قد تكون هناك علاقة عامة وخاصة ، ولكن الغرض من استخدامنا للواجهات ليس هنا.) على سبيل المثال ، من المقبول تعريف المركبات بأنها فصول مجردة ، والسيارات والطائرات والسفن كطائرات فرعية ، لأن السيارات والطائرات والسفن كلها مركبات خاصة. على سبيل المثال ، تقول واجهة icomparable فقط أن الفئات التي تنفذ هذه الواجهة يجب أن تكون قادرة على مقارنتها ، وهي قاعدة. إذا كانت فئة السيارة تنفذ غير قابلة للشفاء ، فهذا يعني فقط أن هناك طريقة في سيارتنا لمقارنة حالتين سيارتين ، والتي قد تكون أغلى من السيارة أو أكبر من السيارة. لا يهم ، لكن لا يمكننا القول أن "السيارات خاصة ويمكن مقارنتها" ، والتي لا تنطبق بشكل نحوي.
آمل أن يكون هذا المقال مفيدًا لبرمجة Java للجميع.