سؤال

هل هناك أي طريقة لإجبار فصول الأطفال على تجاوز الطريقة غير المجردة للفئة الفائقة؟

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

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

المحلول

لا توجد طريقة مباشرة يفرضها المترجم للقيام بذلك، على حد علمي.

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

public abstract class Base {
  public static Base create() {
    return new DefaultBase();
  }

  public abstract void frobnicate();

  static class DefaultBase extends Base {
    public void frobnicate() {
      // default frobnication implementation
    }
  }
}

أنت لا أستطيع يكتب new Base() الآن، ولكن يمكنك القيام به Base.create() للحصول على التنفيذ الافتراضي.

نصائح أخرى

كما أوضح آخرون ، لا يمكنك القيام بذلك بشكل مباشر.

ولكن إحدى طرق القيام بذلك هي استخدام نمط الإستراتيجية ، مثل: Genacodicetagpre

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

أعتقد أن أسهل طريقة هي إنشاء فئة مجردة ترث من الفئة الأساسية: Genacodicetagpre

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

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

هناك سبب أنه غير ممكن!

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

إذًا ما الهدف من إجبار الفصل على تجاوز طريقتك؟لا أعتقد أن هناك أي فائدة.

ستكون الإجابة بلا.يمكنك إعادة التصميم باستخدام نموذج تصميم النموذج.قد يساعدك.

بدلاً من ذلك ، يمكنك جعل الصفوف التابعة لك تنفذ واجهة.قد يتم تنفيذ الواجهة أو عدم تنفيذها بواسطة الفئة الممتازة.

يمكنك دائمًا جعل الفئة الأساسية تحتوي على طريقة تطرح استثناءً.

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

public class Parent {

  public void doStuff() {
    throw new RuntimeException("doStuff() must be overridden");
  }

}

public class Child extends Parent {

  @Override
  public void doStuff() {
    ... all is well here ...
  }

}

الجانب السلبي هو أن هذا لا يمنع إنشاء Base أشياء؛ومع ذلك، فإن أي شخص يحاول استخدام إحدى الطرق "يجب تجاوزها" سيجد قريبًا أنه كان يجب عليه تجاوز الفصل.

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

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

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

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

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

ربما يساعد هذا: Genacodicetagpre

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

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

لنأخذ مثالاً. Genacodicetagpre

سيؤدي هذا إلى طباعة "meowww !!!"على الشاشة.

لكن هذا لا يعني أنه يجب تجاوز الطريقة makeSound في الفصل الفرعي.

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

سيؤدي هذا أيضًا إلى طباعة "meowwww !!!"على الشاشة

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

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