سؤال

فيما يلي مثال على استخدام وراثة الواجهة المتعددة في Java وهناك مشكلة.

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

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

http://en.wikipedia.org/wiki/Diamond_problem

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

وأود أن أعرف ما إذا كان هناك اسم للمشكلة التي أنا على وشك وصفها.

فيما يلي مثال لنوع آخر من الوراثة المتعددة، حيث ترث واجهة واحدة من واجهتين أخريين لهما نوع إرجاع أسلوب غير متوافق:

interface A {
  void a();
  Integer c();
}

interface B {
  void b();
  Long c();
}

interface MI extends A, B {...}

(لاحظ وراثة الواجهة المتعددة في العمل باستخدام الكلمة الأساسية "يمتد")

لا يمكنك فعل ذلك، للأسباب التالية:

النوعان A وB غير متوافقين؛كلاهما يحدد C () ولكن مع نوع الإرجاع غير المرتبط

هل تمت صياغة اسم لوصف هذا الموقف؟

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

المحلول

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

وفي "التفكير في جاوة" كتاب على الانترنت، وليس هناك اسما لذلك سواء. http://www.linuxtopia.org/online_books/programming_books/thinking_in_java/TIJ310_001. هتم

ومجرد جانب علما، C # يسمح تطبيقات واجهة واضحة، والذي يعالج هذه المشكلة.

نصائح أخرى

<م> JLS §6.4. 4، والأعضاء من نوع واجهة يدعو هؤلاء الأعضاء superinterface مكررة على غامضة ، أو ويتطلب خطأ وقت الترجمة. كنت اتمنى لشيء الملونة مثل بوجوليه تأثير و <لأ href = "HTTP: / /en.wikipedia.org/wiki/Heisenbug#Heisenbug "يختلط =" noreferrer نوفولو "> Heisenbug و <لأ href =" http://en.wikipedia.org/wiki/Heisenbug#Heisenbug "يختلط =" noreferrer نوفولو "> وآخرون . ربما <م> two's واحد في الحشد

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

public interface Collection<E> extends Iterable<E> {
    boolean remove(Object o);
}
public interface Set<E> extends Collection<E> {
}
public interface Map<K,V> {
    V remove(Object key);
}

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

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

وأنا لا أتذكر إذا رأيته في حياتي أي اسم لهذا الغرض. في لغة جافا مواصفات لا يوجد اسم لهذا أيضا.

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

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

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

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

وقد فاتني نقطة أو تتحدث عن 'ج' متغير؟

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