هل من الممكن أن يكون المتخصصة المعلمات في تجاوز الأساليب ؟

StackOverflow https://stackoverflow.com/questions/820344

  •  03-07-2019
  •  | 
  •  

سؤال

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

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

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

أي أفكار ؟

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

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

المحلول

public abstract class Shape<S extends Stencil>
{
   public abstract void draw( S stencil );
}

public class Square extends Shape<Stencil1>
{
   public void draw( Stencil1 stencil )
   {
     stencil.letsdo();
     stencil.some();
     stencil.drawing();
   }
}

public class Circle extends Shape<Stencil2>
{
   public void draw( Stencil2 stencil )
   {
      stencil.some();
      stencil.more();
      stencil.drawing();
   }
}

نصائح أخرى

أعتقد أنه ربما يجب عليك إعادة النظر في التصميم الأولي.

بالطبع ، يمكن أن الحصول على حول هذا باستخدام instanceof ، إلخ.ومع ذلك ، فإن هذا سيؤدي في مربكة جدا API (إذا كان هذا هو ما كنت تستخدم).

إذا كنت تريد أن تكون اشتعلت في وقت التحويل الخيارات التالية تتبادر إلى الذهن:

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

تعريف abstact الاستنسل والسماح فرعية منشئ تقرر أي الاستنسل الدرجة للاستخدام.

private Stencil s;

public void draw(){
   privateDraw(s)
}

private abstract void privateDraw(Stencil s);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top