[oop] متى تستخدم واجهة بدلاً من صف مجردة والعكس بالعكس؟


9 Answers

يمكن أن يكون للفصل التجريدي حالة أو وظيفة مشتركة. الواجهة هي مجرد وعد بتوفير الحالة أو الوظيفة. ستؤدي فئة الملخص الجيد إلى تقليل مقدار الشفرة التي يجب إعادة كتابتها نظرًا لأنه يمكن مشاركة الوظيفة أو الولاية. لا تحتوي الواجهة على معلومات محددة لتتم مشاركتها

Question

قد يكون هذا سؤال OOP عام. أردت إجراء مقارنة عامة بين واجهة وفئة مجردة على أساس استخدامها.

متى يريد المرء استخدام واجهة ومتى يريد المرء استخدام فئة مجردة ؟




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




بالنسبة لي ، كنت سأذهب مع واجهات في كثير من الحالات. لكني أفضل الفصول التجريدية في بعض الحالات.

تشير الفصول في OO generaly إلى التنفيذ. أستخدم فصول دراسية مجردة عندما أريد فرض بعض تفاصيل التنفيذ على الأطفال الآخرين الذين أذهب معهم باستخدام واجهات.

وبالطبع ، فإن الفصول التجريدية مفيدة ليس فقط في فرض التنفيذ ولكن أيضًا في تبادل بعض التفاصيل المحددة بين العديد من الطبقات ذات الصلة.







قد ترث الفئات من فئة أساسية واحدة فقط ، لذلك إذا كنت ترغب في استخدام فئات مجردة لتوفير تعدد الأشكال لمجموعة من الفئات ، فيجب أن ترث جميعها من تلك الفئة. قد توفر الطبقات المجردة أيضًا الأعضاء الذين تم بالفعل تنفيذها. لذلك ، يمكنك التأكد من قدر معين من الوظائف المتطابقة مع فئة مجردة ، ولكن لا يمكن مع واجهة.

فيما يلي بعض التوصيات لمساعدتك على تحديد ما إذا كنت ستستخدم واجهة أو فئة تجريدية لتوفير تعدد أشكال لمكوناتك.

  • إذا كنت تتوقع إنشاء إصدارات متعددة من المكون الخاص بك ، قم بإنشاء فئة مجردة. توفر الطبقات Abstract طريقة بسيطة وسهلة لإصدار المكونات الخاصة بك. بتحديث الفئة الأساسية ، يتم تحديث جميع فئات المورثة تلقائيًا بالتغيير. من ناحية أخرى ، لا يمكن تغيير الواجهات بمجرد إنشائها بهذه الطريقة. إذا كان إصدار جديد من الواجهة مطلوبًا ، فيجب عليك إنشاء واجهة جديدة بالكامل.
  • إذا كانت الوظيفة التي تقوم بإنشائها مفيدة عبر مجموعة كبيرة من الكائنات المتباينة ، فاستخدم واجهة. يجب استخدام الفئات المستخلصة بشكل أساسي للأشياء التي ترتبط ارتباطًا وثيقًا ، في حين أن الواجهات هي الأنسب لتوفير وظائف مشتركة لفئات غير ذات صلة.
  • إذا كنت تقوم بتصميم أجزاء صغيرة ومختصرة من الوظائف ، فاستخدم الواجهات. إذا كنت تصمم وحدات وظيفية كبيرة ، استخدم فئة تجريدية.
  • إذا كنت تريد توفير وظائف شائعة ومطبقة بين جميع عمليات تنفيذ المكون الخاص بك ، استخدم فئة الملخص. تسمح لك الفصول الدراسية المجردة بتنفيذ فصلك جزئيًا ، بينما لا تحتوي الواجهات على أي تطبيق لأي عضو.

تم النسخ من:
http://msdn.microsoft.com/en-us/library/scsyfw1d%28v=vs.71%29.aspx




في java ، يمكنك أن ترث من فئة واحدة (مجردة) إلى وظيفة "توفير" ، ويمكنك تنفيذ العديد من الواجهات "لضمان" وظيفة




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




سنتى:

تعرف الواجهة بشكل أساسي العقد ، أي فئة تنفيذية يجب أن تلتزم (بتطبيق أعضاء الواجهة). لا يحتوي على أي كود.

من ناحية أخرى ، يمكن أن تحتوي فئة الملخص على تعليمات برمجية ، وقد تكون هناك بعض الطرق التي تم وضع علامة عليها كمجرد والتي يجب أن تنفذها فئة وراثية.

الحالات النادرة التي استخدمتها للفصول التجريدية هي عندما يكون لديّ بعض الوظائف الافتراضية التي قد لا تكون الطبقة الموروثة مثيرة للاهتمام في تجاوزها ، في فئة أساسية مجردة ، والتي ترثها بعض الفئات المتخصصة.

مثال (بدائية جداً!): ضع في الاعتبار فئة أساسية تسمى "العميل" والتي تحتوي على طرق مجردة مثل CalculatePayment() و CalculateRewardPoints() وبعض الطرق غير المجردة مثل GetName() و SavePaymentDetails() .

سوف ترث الفئات المتخصصة مثل RegularCustomer و GoldCustomer من الفئة الأساسية Customer وتنفيذ منطق الأسلوب CalculateRewardPoints() الخاص به و CalculateRewardPoints() ولكن إعادة استخدام أساليب GetName() و SavePaymentDetails() .

يمكنك إضافة المزيد من الوظائف إلى فئة تجريدية (بدون أساليب مجردة) دون التأثير على الفئات الفرعية التي تستخدم إصدارًا أقدم. في حين أن إضافة طرق إلى واجهة من شأنه أن يؤثر على جميع الفئات التي تنفذها حيث أنها ستحتاج الآن إلى تنفيذ أعضاء الواجهة المضافة حديثًا.

فئة مجردة مع جميع أعضاء مجردة ستكون مشابهة لواجهة.




حسناً ، بعد أن قمت بـ "grokked" هذا بنفسي - هنا هي شروط الشخص العادي (لا تتردد في تصحيحي إذا كنت مخطئًا) - أعلم أن هذا الموضوع هو أمر مغرور ، لكن شخصًا آخر قد يتعثر عبره يومًا ما ...

تسمح لك الفصول الدراسية المستخلصة بإنشاء مخطط ، وتسمح لك بإضافة الخصائص والطرق (CONSTRUCT) (التنفيذ) التي تريد أن تمتلكها جميع أحفادها.

تسمح لك الواجهة من ناحية أخرى فقط بالإعلان عن رغبتك في وجود خصائص و / أو طرق مع اسم معين في جميع الطبقات التي تقوم بتطبيقه - ولكنك لا تحدد كيفية تنفيذ ذلك. أيضا ، يمكن للفئة تنفيذ واجهات كثيرة ، ولكن يمكن فقط تمديد فئة واحدة الملخص. إن الواجهة هي أداة معمارية عالية المستوى (والتي تصبح أكثر وضوحًا إذا بدأت في فهم أنماط التصميم) - فملخص يحتوي على قدم في كلا المعسكرين ويمكنه أداء بعض الأعمال القذرة أيضًا.

لماذا استخدام واحد على الآخر؟ الأول يسمح بتعريف أكثر واقعية للأحفاد - وهذا الأخير يسمح لتعدد الأشكال أكبر. هذه النقطة الأخيرة مهمة للمستخدم النهائي / المبرمج ، الذي يمكنه استخدام هذه المعلومات لتنفيذ AP I (nterface) في مجموعة متنوعة من الأشكال / الأشكال لتناسب احتياجاتهم.

أعتقد أن هذه كانت لحظة "lightbulb" بالنسبة لي - فكر في واجهات أقل من منظور المؤلف وأكثر من ذلك من أي مبرمج قادم لاحقًا في السلسلة يضيف تنفيذًا إلى مشروع ، أو يوسع واجهة برمجة التطبيقات.




هذا يمكن أن يكون دعوة صعبة للغاية لجعل ...

مؤشر واحد يمكنني تقديمه: يمكن للعنصر تنفيذ العديد من الواجهات ، في حين أن كائن ما يمكن أن يرث طبقة أساسية واحدة فقط (بلغة OO الحديثة مثل c # ، أعرف أن C ++ لها ميراث متعدد - لكن أليس هذا مستاءً؟)




Related