سؤال

سمعت أن هناك طريقة الغش الميراث واحدة وتنفيذ العديد الميراث في جاوة.لا أحد يعرف كيفية تنفيذ هذا(مع استخدام واجهة)?

فقط من باب الفضول ;-)

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

المحلول

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

على أي حال, انها صعبة معقدة دروس و هل يمكن الحصول على أكثر من وظيفة باستخدام ثابت الواردات (من جافا 5).السؤال الكبير عن مقابلات حانة مسابقات, على الرغم ;-)

نصائح أخرى

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

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

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

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

بدلا من ذلك, يمكنك محاكاة متعددة الميراث من خلال الوفد.انظر هذه المادة على سبيل المثال.

يمكنك الغش قليلا (وأشدد قليلا) باستخدام جافا.لانغ.تعكس.وكيل الحالات.

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

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

استخدام interfaces.يمكنك تنفيذ العديد كما تريد.يمكنك عادة استخدام بعض البديل عن نمط مركب (GoF) أن تكون قادرة على إعادة استخدام رمز التنفيذ إذا كان هذا هو مرغوب فيه.

عليك أن تكون حذرا أن يميز واجهة الميراث (أساسا الميراث العقد لتوفير مرافق معينة) من الميراث (ميراث آليات التنفيذ).

جافا يوفر واجهة الميراث من قبل تنفذ آلية لك يمكن يكون واجهة متعددة الميراث.

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

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

جافا لا يدعم متعددة الإرث.

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

عادة عندما شخص ما يشير إلى عدة الإرث في c# أو جافا لها يرجع ذلك إلى حقيقة أن 'يمكن' في c++.أنا معجب فقط لأنه يمكنك doens لا يعني أن عليك'.مثل c# & JAVA لا يدعم ذلك, لماذا حاول إجبارها على فعل شيء لم تكن تهدف إلى القيام به.هذا لا يعني أن هناك حالة فريدة من نوعها حيث أنها صالحة تقنية empoly فقط رمز يمكن عادة ريفاكتوريد أن لا حاجة إليها.

كنت أفكر في هذا أكثر من أن يدرك أنه في حين أن وكلاء الديناميكي العمل (كيف RMI (المستخدمة؟) إلى العمل) ، إذا كنت تريد حقا هذا النوع من الوظائف يمكنك أن تكون أفضل حالا تبحث في الجانب برمجة (اوب) استخدام شيء من هذا القبيل AspectJ (eclipse.org/aspectj).

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

كما أي شخص آخر قد أشار إلى الرغبة/الحاجة متعددة الميراث عموما يشير إلى أنك لا تقترب المشكلة من منظور الحق.تذكر صندوق جلوبل القناص مبدأ "تفضل تكوين على الميراث" البداية!

كان هناك جهد لجلب mixins في جافا.التحقق من هذا الارتباط بها: http://www.disi.unige.it/person/LagorioG/jam/

باستخدام الطبقات الداخلية ، وهذا هو ما C++ في بعض الأحيان يفضل أيضا: الطبقة الداخلية من لغة.

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

public class parents implements first, second{

}

ولكن تذكر أن لديك لتجاوز الطرق المعلنة في الواجهات.

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