سؤال

متى يجب استخدام واجهة و متى يجب استخدام قاعدة الفصل ؟

ينبغي أن يكون دائما واجهة إذا كنت لا تريد في الواقع تحديد قاعدة تنفيذ الأساليب ؟

إذا كان لدي كلب و قطة الدرجة.لماذا أريد أن تنفيذ إبت بدلا من PetBase?أنا يمكن أن نفهم وجود واجهات ISheds أو IBarks (IMakesNoise?), لأن هؤلاء يمكن أن توضع على الحيوانات الأليفة من الحيوانات الأليفة الاساس ولكن أنا لا أفهم أي استخدام عام عن الحيوانات الأليفة.

هل كانت مفيدة؟

المحلول

دعونا نأخذ المثال الخاص بك الكلب و القط الفئة ، دعونا توضيح باستخدام C#:

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

public abstract class Mammal

هذه قاعدة الطبقة سوف يكون على الأرجح الافتراضي أساليب مثل:

  • تغذية
  • صديقي

وكلها السلوك أن يكون أكثر أو أقل نفس التنفيذ بين إما الأنواع.لتحديد هذا سوف يكون لديك:

public class Dog : Mammal
public class Cat : Mammal

الآن دعونا نفترض أن هناك الثدييات الأخرى التي عادة ما نرى في حديقة الحيوانات:

public class Giraffe : Mammal
public class Rhinoceros : Mammal
public class Hippopotamus : Mammal

هذا سوف لا يزال تكون صالحة لأن في جوهر وظيفة Feed() و Mate() سوف يكون لا يزال هو نفسه.

ومع ذلك والزرافات ووحيد القرن و فرس النهر ليست بالضبط الحيوانات التي يمكن أن تجعل الحيوانات الأليفة خارج.حيث ان واجهة من شأنها أن تكون مفيدة:

public interface IPettable
{
    IList<Trick> Tricks{get; set;}
    void Bathe();
    void Train(Trick t);
}

تنفيذ أعلاه العقد لن يكون نفسه بين القط و الكلب ؛ وضع التطبيقات في فئة مجردة وراثة سوف تكون فكرة سيئة.

الكلب و القط التعاريف الآن يجب أن تبدو مثل:

public class Dog : Mammal, IPettable
public class Cat : Mammal, IPettable

نظريا يمكنك تجاوز لهم من قاعدة أعلى فئة, ولكن أساسا واجهة يسمح لك لإضافة فقط على الأشياء التي تحتاج إلى فئة دون الحاجة إلى الميراث.

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

نصائح أخرى

حسنا, جوش بلوك قال في نفسه فعالة جافا 2d:

تفضل واجهات أكثر فئات مجردة

بعض النقاط الرئيسية:

  • الفئات الموجودة يمكن بسهولة تعديل لتنفيذ جديد واجهة.كل ما عليك القيام به هو إضافة الطرق اللازمة إذا لم تكن توجد إضافة تنفذ شرط أن فئة الإعلان.

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

  • واجهات تسمح بناء nonhierarchical نوع الأطر.نوع الهرمية هي رائع لتنظيم بعض الأمور, ولكن أشياء أخرى لا تقع بدقة في هرمي صارم.

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

وعلاوة على ذلك, يمكنك الجمع بين الفضائل واجهات فئات مجردة من توفير مجردة الهيكل العظمي تنفيذ الطبقة للذهاب مع كل بديهي واجهة تصدير.

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

PS.:شراء الكتاب.انها الكثير أكثر تفصيلا.

الطراز الحديث هو تحديد إبت و PetBase.

الاستفادة من واجهة أخرى كود يمكن استخدامه دون أي روابط على الإطلاق إلى غيرها من التعليمات البرمجية القابلة للتنفيذ.تماما "نظيفة". أيضا واجهات يمكن أن تكون مختلطة.

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

واجهات فئات أساسية تمثل اثنين من أشكال مختلفة من العلاقات.

الميراث (قاعدة الطبقات) تمثل "هو" علاقة.E. g.كلب أو قطة "هو-" الحيوانات الأليفة.هذه العلاقة دائما يمثل (واحد) الغرض من الطبقة (بالاشتراك مع "المسؤولية واحدة المبدأ").

واجهات, ومن ناحية أخرى ، تمثل ميزات إضافية من فئة.أود أن نسميها "هو" العلاقة مثل "Foo هو المتاح" ، ومن ثم IDisposable واجهة في C#.

واجهات

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

قاعدة الطبقات

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

بشكل عام, يجب أن صالح واجهات أكثر فئات مجردة.سبب واحد لاستخدام فئة مجردة هو إذا كان لديك التنفيذ المشترك بين فئات محددة.بالطبع يجب أن لا تزال تعلن واجهة (إبت) و فئة مجردة (PetBase) تنفيذ تلك الواجهة.باستخدام صغيرة, واجهات متميزة ، يمكنك استخدام مضاعفات لزيادة تحسين المرونة.واجهات تتيح أقصى قدر من المرونة وقابلية أنواع عبر الحدود.عند تمرير الإشارات عبر الحدود تمر دائما واجهة وليس الخرسانة نوع.يسمح هذا المتلقي لتحديد التنفيذ الملموس و يوفر أقصى قدر من المرونة.هذا صحيح تماما عندما البرمجة في TDD/BDD الموضة.

عصابة من أربعة ذكرت في كتاب "بسبب الميراث يعرض فئة فرعية إلى تفاصيل الأم التنفيذ ، فإنه كثيرا ما يقال أن 'الميراث فواصل التغليف".أعتقد أن هذا صحيح.

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

كرزيستوف Cwalina يقول في الصفحة 81:

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

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

خوان ،

أحب أن أفكر في واجهات كوسيلة لوصف فئة.معين سلالة الكلب فئة أقول YorkshireTerrier ، قد يكون نزل الوالد الكلب فئة ، بل هو أيضا بتنفيذ IFurry, IStubby ، IYippieDog.وبالتالي فإن الطبقة تعرف ما الطبقة ولكن واجهة يخبرنا الأمور حول هذا الموضوع.

وميزة هذا يتيح لي الفرصة ، على سبيل المثال ، جمع كل IYippieDog و رمي في المحيط المجموعة.حتى الآن أنا يمكن أن تصل عبر مجموعة معينة من الكائنات والعثور على تلك التي تستوفي معايير أنا أبحث في دون تفتيش الطبقة بشكل وثيق جدا.

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

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

حتى إذا كنت تعتقد مثلي كنت أقول بالتأكيد أن القط و الكلب IPettable.وهو الوصف الذي يطابق لهم على حد سواء.

قطعة أخرى من هذا على الرغم من أن لديهم نفس قاعدة الفصل ؟ السؤال هو هل هم بحاجة إلى أن تكون على نطاق واسع يعامل نفس الشيء.بالتأكيد هم كل من الحيوانات ، ولكن هل ينطبق ذلك كيف نحن ذاهبون لاستخدامها جنبا إلى جنب.

أقول أريد أن جمع كل الحيوانات الطبقات ووضعها في تابوت الحاوية.

أو أنها تحتاج إلى أن تكون الثدييات?ربما نحن بحاجة إلى نوع من الصليب الحيوان حلب المصنع ؟

أنها لا تحتاج حتى إلى أن تكون مرتبطة معا في كل شيء ؟ هل يكفي أن تعرف فقط كلاهما IPettable?

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

قد تجد أيضا في بعض نقطة أنه ليس كل القطط IPettable (مثل هذا واحد أصلع).الآن يمكنك تحريك واجهة لجميع الفئات المشتقة التي تناسب.سوف تجد أن أقل بكثير كسر التغيير أن كل من المفاجئ القطط لم تعد المستمدة من PettableBase.

هنا هو الأساسي و بسيطة definiton من واجهة الفئة الأساسية:

  • قاعدة class = كائن الميراث.
  • واجهة = الوظيفية الميراث.

هتافات

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

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

وذلك بدلا من إبت أو PetBase ، كنت قد ينتهي مع الحيوانات الأليفة التي لديها IFurBehavior المعلمة.على IFurBehavior المعلمة التي وضعتها CreateDog() طريقة PetFactory.ومن هذه المعلمة التي دعا السقيفة (طريقة).

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

أوصي هذا النمط حتى في متعددة-الإرث اللغات.

وأوضح في هذا جافا عالم المادة

أنا شخصيا أميل إلى استخدام واجهات تحديد واجهات - أيأجزاء من تصميم النظام التي تحدد ما ينبغي أن يكون الوصول إليها.

فإنه ليس من غير المألوف أن سوف يكون فئة المنفذين 1 أو أكثر الواجهات.

فئات مجردة لا تستخدم كأساس شيء آخر.

التالي هو مقتطف من المادة المذكورة أعلاه ، JavaWorld.com المادة المؤلف توني Sintes, 04/20/01


واجهة مقابلفئة مجردة

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

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

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

مقابل فئةواجهة

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

على سبيل المثال, نمط استراتيجية يتيح لك مبادلة الجديدة خوارزميات العمليات في البرنامج دون تغيير الأشياء التي تستخدمها.وسائل الاعلام لاعب يمكن أن نعرف كيفية تشغيل الأقراص المضغوطة, ملفات Mp3 و wav.بالطبع أنت لا تريد تضمين هذه التشغيل الخوارزميات إلى لاعب ؛ من شأنها أن تجعل من الصعب إضافة شكل جديد مثل AVI.وعلاوة على ذلك, الكود الخاص بك سوف يكون تناثرت غير مجدية حالة البيانات.و مما يزيد الطين بلة, سوف تحتاج إلى تحديث الحالة هذه البيانات في كل مرة تقوم بإضافة خوارزمية جديدة.جميع في كل شيء ، هذه ليست وجوه المنحى طريقة البرنامج.

مع نمط استراتيجية ، يمكنك ببساطة تحديد خوارزمية خلف كائن.إذا كنت تفعل ذلك ، يمكنك أن توفر وسائل الإعلام الجديدة الإضافات في أي وقت.دعونا ندعو المكونات في الدرجة MediaStrategy.هذا الكائن أن يكون أسلوب واحد:playStream(تيار s).وذلك إضافة خوارزمية جديدة, نحن ببساطة نعرب الدرجة الخوارزمية.الآن البرنامج عندما واجه وسائل الإعلام الجديدة نوع ببساطة المندوبين اللعب من تيار إلى وسائل الإعلام لدينا استراتيجية.بالطبع, سوف تحتاج بعض السباكة بشكل صحيح إنشاء خوارزمية الاستراتيجيات التي سوف تحتاج.

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

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

لدي الخام سيادة الإبهام

وظائف: من المرجح أن تكون مختلفة في كل أجزاء:واجهة.

البيانات, وظائف, قطع غيار سوف تكون في الغالب نفس أجزاء مختلفة: فئة مجردة.

البيانات, وظائف, عمل في الواقع ، إذا مددت فقط مع تغييرات طفيفة: العادية (الخرسانة) فئة

البيانات وظائف, أي تغييرات المخطط: العادية (الخرسانة) الدرجة النهائية التعديل.

البيانات و ربما وظائف:للقراءة فقط: التعداد أعضاء.

هذا هو تقريبي وليس في جميع محددة بدقة ، ولكن هناك مجموعة من واجهات حيث كل شيء يهدف إلى تغيير إلى enums حيث يتم إصلاح كل شيء قليلا مثل ملف للقراءة فقط.

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

فئات مجردة هي الاختصارات.هل هناك أشياء أن جميع المشتقات من PetBase حصة يمكنك رمز مرة واحدة ويمكن القيام به ؟ إذا كان الجواب نعم, ثم حان الوقت للحصول على فئة مجردة.

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

فئات مجردة قد تحتوي على عدة واجهات.الخاص بك PetBase فئة مجردة قد تنفذ إبت (الحيوانات الأليفة أصحاب) و IDigestion (تأكل الحيوانات الأليفة, أو على الأقل ينبغي أن).ومع ذلك ، PetBase ربما لن تنفذ IMammal ، إذ ليس كل الحيوانات الأليفة هي الثدييات وليس كل الثدييات هي الحيوانات الأليفة.يمكنك إضافة MammalPetBase الذي يمتد PetBase وإضافة IMammal.FishBase يمكن أن يكون PetBase وإضافة IFish.IFish قد ISwim و IUnderwaterBreather كما الواجهات.

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

حالة قاعدة الطبقات على واجهات وأوضح حسن في Submain .صافي الترميز التوجيهية:

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

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

  1. لا علاقة لها عدة فصول ترغب في دعم البروتوكول.
  2. هذه الفئات بالفعل تأسيس قاعدة الطبقات (عن سبيل المثال ، وبعضها واجهة المستخدم (UI) الضوابط ، وبعضها خدمات ويب XML).
  3. التجميع غير مناسب أو عمليا.في جميع أخرى الحالات ، الطبقة الميراث هو نموذج أفضل.

المصدر: http://jasonroell.com/2014/12/09/interfaces-vs-abstract-classes-what-should-you-use/

C# هي اللغة الرائعة التي قد نضجت وتطورت على مدى السنوات ال 14 الماضية.هذا شيء عظيم بالنسبة لنا المطورين لأن ناضجة اللغة يوفر لنا مجموعة كبيرة من ميزات اللغة التي في حوزتنا.

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

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

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

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

public abstract class Dog
{
      public virtual void Bark()
      {
        Console.WriteLine("Base Class implementation of Bark");
      }
}

public class GoldenRetriever : Dog
{
   // the Bark method is inherited from the Dog class
}

public class Poodle : Dog
{
  // here we are overriding the base functionality of Bark with our new implementation
  // specific to the Poodle class
  public override void Bark()
  {
     Console.WriteLine("Poodle's implementation of Bark");
  }
}

// Add a list of dogs to a collection and call the bark method.

void Main()
{
    var poodle = new Poodle();
    var goldenRetriever = new GoldenRetriever();

    var dogs = new List<Dog>();
    dogs.Add(poodle);
    dogs.Add(goldenRetriever);

    foreach (var dog in dogs)
    {
       dog.Bark();
    }
}

// Output will be:
// Poodle's implementation of Bark
// Base Class implementation of Bark

// 

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

ولكن أنا متأكد من أنك تعرف بالفعل أن.

أنت هنا لأنك تريد أن تفهم لماذا قد ترغب في اختيار واجهة على فئة مجردة أو العكس بالعكس.حسنا سبب واحد قد ترغب في اختيار واجهة على فئة مجردة هو عندما لا يكون لديك أو ترغب في منع الافتراضي التنفيذ.هذا هو عادة بسبب الأنواع التي يتم تنفيذ واجهة غير ذات الصلة في "هو" العلاقة.في الواقع, لا يجب أن تكون ذات صلة في كل شيء باستثناء حقيقة أن كل نوع "قادر" أو "ablity" للقيام بشيء ما أو شيء ما.

الآن ماذا يعني ذلك ؟ حسنا, على سبيل المثال:الإنسان ليس داك و داك هو الإنسان.من الواضح جدا.غير أن كلا من البطة و الإنسان لديه "القدرة" على السباحة (بالنظر إلى أن البشرية مرت له دروس السباحة في الصف 1 :) ).أيضا, منذ بطة ليس من الإنسان أو العكس ، هذا ليس "هو" realationship, ولكن بدلا من ذلك "على" العلاقة ويمكننا استخدام واجهة لتوضيح ذلك:

// Create ISwimable interface
public interface ISwimable
{
      public void Swim();
}

// Have Human implement ISwimable Interface
public class Human : ISwimable

     public void Swim()
     {
        //Human's implementation of Swim
        Console.WriteLine("I'm a human swimming!");
     }

// Have Duck implement ISwimable interface
public class Duck: ISwimable
{
     public void Swim()
     {
          // Duck's implementation of Swim
          Console.WriteLine("Quack! Quack! I'm a Duck swimming!")
     }
}

//Now they can both be used in places where you just need an object that has the ability "to swim"

public void ShowHowYouSwim(ISwimable somethingThatCanSwim)
{
     somethingThatCanSwim.Swim();
}

public void Main()
{
      var human = new Human();
      var duck = new Duck();

      var listOfThingsThatCanSwim = new List<ISwimable>();

      listOfThingsThatCanSwim.Add(duck);
      listOfThingsThatCanSwim.Add(human);

      foreach (var something in listOfThingsThatCanSwim)
      {
           ShowHowYouSwim(something);
      }
}

 // So at runtime the correct implementation of something.Swim() will be called
 // Output:
 // Quack! Quack! I'm a Duck swimming!
 // I'm a human swimming!

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

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

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

موجز:

إذا القاعدة الرئيسية من التجربة هو استخدام فئة مجردة عندما تريد تنفيذ "الافتراضي" وظائف الفئة الهرمي و/أو فئات أو أنواع العمل مع مشاركة "هو" العلاقة (ex.كلب "هو" نوع من الكلاب).

من ناحية أخرى استخدام واجهة عندما لا يكون "هو" العلاقة ولكن الأنواع التي تشترك في "القدرة" أن تفعل شيئا أو يكون شيئا (ex.بطة "ليس" الإنسان.ومع ذلك, بطة الإنسان حصة "القدرة" على السباحة).

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

تذكر أيضا عند استخدام واجهات الانضمام إلى واجهة الفصل بين مبدأ (ISP).ISP الدول التي لا ينبغي أن يكون العميل يضطر إلى الاعتماد على أساليب أنها لا تستخدم.لهذا السبب واجهات ينبغي أن تركز على مهام محددة وعادة ما تكون صغيرة جدا (ex.IDisposable, IComparable ).

طرف آخر إذا كنت تقوم بتطوير صغيرة وموجزة بت من الوظائف ، استخدام الواجهات.إذا كنت تقوم بتصميم كبير الوحدات الوظيفية استخدام فئة مجردة.

نأمل أن يكون هذا يوضح الامور لبعض الناس!

أيضا إذا كنت تستطيع التفكير في أي شيء أفضل الأمثلة أو تريد أن نشير شيء, أرجوك أن تفعل ذلك في التعليقات أدناه!

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

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

من البناء على سبيل المثال تستخدم كثيرا في هذه المسألة بالذات ، هناك الكثير من الأشياء التي هي petable - الصديقات, السيارات, غامض البطانيات... لذا قد يكون Petable الفئة التي قدمت هذا السلوك المشترك ، ومن مختلف الطبقات وراثة من ذلك.

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

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

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

شيء آخر كنت أود أن أضيف أنه إذا كان الصف بحتة مجردة - لا غير مجردة وغير الموروثة أعضاء أو أساليب يتعرض الطفل, الأم, أو العميل ثم لماذا هو الصف ؟ ويمكن الاستعاضة عنها في بعض الحالات من خلال واجهة و في حالات أخرى من قبل Null.

تفضل واجهات أكثر فئات مجردة

الأساس المنطقي ، النقاط الرئيسية التي يجب مراعاتها [اثنين سبق ذكره هنا] هي :

  • واجهات أكثر مرونة ، لأن فئة يمكن تنفيذ متعددة الواجهات.منذ جافا لا يكون وراثة متعددة باستخدام فئات مجردة يمنع المستخدمين من استخدام أي فئة أخرى التسلسل الهرمي. في عام ، تفضل واجهات عندما يكون هناك أي تقصير تطبيقات أو الدولة. جافا مجموعات تقدم أمثلة جيدة هذا (خريطة, مجموعة, الخ.).
  • فئات مجردة يتيح أفضل إلى الأمام التوافق.مرة واحدة للعملاء استخدام واجهة, لا يمكنك تغيير ذلك ؛ إذا كانت تستخدم فئة مجردة, لا يزال يمكنك إضافة السلوك دون كسر رمز القائمة. إذا كان التوافق هو مصدر قلق ، النظر في استخدام فئات مجردة.
  • حتى إذا كان لديك الافتراضي تطبيقات أو الداخلية للدولة ، والنظر في تقديم واجهة مجردة تنفيذ ذلك.وهذا سوف يساعد العملاء, ولكن لا تزال تسمح لهم حرية أكبر إذا المطلوب [1].
    طبعا هذا الموضوع قد نوقش في طول في مكان آخر [2,3].

[1] يضيف المزيد من التعليمات البرمجية ، بالطبع ، ولكن إذا كان الإيجاز هو الشاغل الرئيسي الخاص بك, ربما لا يجب عليك تجنبها جافا في المقام الأول!

[2] يشوع بلوخ فعالة جافا, العناصر 16-18.

[3] http://www.codeproject.com/KB/ar...

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

لا تستخدم قاعدة الطبقة إلا إذا كنت تعرف ماذا يعني ، أنه ينطبق في هذه الحالة.إذا كان ينطبق استخدامه, وإلا, استخدام الواجهات.ولكن ملاحظة الجواب عن الواجهات.

العامة الميراث هو يبالغ في OOD وتعرب أكثر بكثير من معظم المطورين يدركون أو على استعداد أن ترقى إلى مستوى.ترى Liskov Substitutablity مبدأ

باختصار, إذا كان "هو" ب ثم لا يتطلب أكثر من " ب " و يسلم ما لا يقل عن B, لكل طريقة الكشف.

من الناحية النظرية, واجهة استخدام رسميا أو شبه رسمي تحديد مجموعة من الأساليب التي كائن سوف تقدم.رسميا يعني مجموعة من الأسلوب أسماء و تواقيع, شبه رسميا يعني الإنسان للقراءة الوثائق المرتبطة بتلك الأساليب.واجهات فقط وصف API (بعد كل شيء ، API تقف على التطبيق مبرمج واجهة), أنها لا يمكن أن تحتوي على أي لأنه ليس من الممكن استخدام أو تشغيل واجهة.إلا أنها تجعل صريحة عقد كيف يجب أن تتفاعل مع كائن.

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

هناك فرق بين قاعدة فئة قاعدة مجردة الطبقات (ABC).أبجديات مزيج واجهة والتنفيذ معا.مجردة خارج برمجة الكمبيوتر يعني "الملخص" ، وهذا هو "مجردة == واجهة".قاعدة مجردة يمكن أن فئة ثم وصف كل واجهة ، وكذلك فارغة أو الجزئي أو التنفيذ الكامل الذي يقصد به أن تكون موروثة.

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

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

خيار آخر أن نأخذ في الاعتبار هو استخدام "لديه" علاقة الملقب بـ "تنفيذ شروط" أو "التكوين." في بعض الأحيان هذا هو أنظف وأكثر مرونة هيكل الأشياء من استخدام "هو-" الميراث.

قد لا يجعل الكثير من المعنى منطقيا أن نقول أن الكلب والقط كل من "قد" الحيوانات الأليفة, لكنه يتجنب مشتركة متعددة الميراث المزالق:

public class Pet
{
    void Bathe();
    void Train(Trick t);
}

public class Dog
{
    private Pet pet;

    public void Bathe() { pet.Bathe(); }
    public void Train(Trick t) { pet.Train(t); }
}

public class Cat
{
    private Pet pet;

    public void Bathe() { pet.Bathe(); }
    public void Train(Trick t) { pet.Train(t); }
}

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

التكوين هو الأفضل عندما لا مدخل خاص مطلوب و لا تحتاج إلى الرجوع إلى الكلب و القط باستخدام عامة الحيوانات الأليفة المراجع/المؤشرات.واجهات تعطيك عامة الإشارة القدرة يمكن أن تساعد على خفض الإسهاب من التعليمات البرمجية الخاصة بك, ولكن أيضا يمكن أن تعتم الأشياء عندما تكون سيئة التنظيم.الميراث مفيد عندما تحتاج عضو والوصول في استخدامه كنت ارتكاب نفسك للغاية اقتران الكلب و القط الطبقات إلى الطبقة الحيوانات الأليفة, وهو حاد تكلفة الدفع.

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

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

الجانب السلبي تنفيذ قاعدة الطبقة شرط override (أو new) الأساليب القائمة.وهذا يجعلها طرق افتراضية مما يعني أنك يجب أن تكون حذرا حول كيفية استخدام مثيل الكائن.

وأخيرا واحدة من الميراث .صافي يقتلني.ساذجة سبيل المثال:أقول أنت تجعل المستخدم التحكم, إذا كنت ترث UserControl.ولكن الآن أنت أقفلت أيضا وراثة PetBase.وهذا يفرض عليك أن تنظيم مثل لجعل PetBase فئة الأعضاء, بدلا من ذلك.

@جويل:بعض اللغات (مثل C++) تسمح متعددة الميراث.

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

فيما يتعلق C#, في بعض الحواس واجهات فئات مجردة يمكن أن تكون قابلة للتبديل.ومع ذلك ، فإن الاختلافات هي:ط) واجهات لا يمكن تنفيذ القانون ؛ ii) لأن هذه الواجهات لا يمكن استدعاء مزيد من كومة إلى فئة فرعية;و الثالث) يمكن إلا أن فئة مجردة قد تكون موروثة على فئة ، بينما واجهات متعددة ويمكن تنفيذها على الدرجة.

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

لقد وجدت أن نمط واجهة > مجردة > أعمال الخرسانة في استخدام القضية:

1.  You have a general interface (eg IPet)
2.  You have a implementation that is less general (eg Mammal)
3.  You have many concrete members (eg Cat, Dog, Ape)

فئة مجردة تحدد الافتراضية المشتركة سمات فئات محددة ، ومع ذلك يفرض واجهة.على سبيل المثال:

public interface IPet{

    public boolean hasHair();

    public boolean walksUprights();

    public boolean hasNipples();
}

الآن, بما أن جميع الثدييات الشعر و الحلمات (AFAIK أنا لست عالم الحيوان) ، يمكن أن لفة في الفئة الأساسية مجردة ،

public abstract class Mammal() implements IPet{

     @override
     public walksUpright(){
         throw new NotSupportedException("Walks Upright not implemented");
     }

     @override
     public hasNipples(){return true}

     @override
     public hasHair(){return true}

ثم فئات محددة مجرد تعريف أنهم المشي منتصبا.

public class Ape extends Mammal(){

    @override
    public walksUpright(return true)
}

public class Catextends Mammal(){

    @override
    public walksUpright(return false)
}

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

في هذه الحالة, مجردة يمكن أن تكون ملموسة ؛ ومع ذلك ، فإن مجردة تسمية يساعد على التأكيد على أن هذا النمط في الوقت الراهن.

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top