سؤال

أنا أكتب (حسنًا ، أكمل) "تمديد" لجافا الذي سيساعد في برمجة الأدوار.
أقوم بترجمة الكود الخاص بي إلى رمز Java مع Javacc. يضيف المترجمون الخاص بي إلى كل فئة معلنة بعض التعليمات البرمجية. إليك مثال على ذلك أوضح:

MyClass extends String implements ObjectWithRoles { //implements... is added
    /*Added by me */
    public setRole(...){...}
    public ...
    /*Ends of stuff added*/
    ...//myClass stuff
}

يضيف الأدوات .. والطرق اللازمة لكل فئة تعلن. خشن جدا ، أليس كذلك؟

سيكون من الأفضل أن أكتب أساليب في فصل واحد ويمتد كل الفصل إلى ذلك .. لكن .. إذا كان الفصل يمتد بالفعل فئة أخرى (تمامًا مثل المثال)؟

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

كانت فكرتي هي تمديد java.lang.object .. لكن لا يمكنك ذلك. (حقا؟)
أفكار أخرى؟

أنا جديد هنا ، لكني أتابع هذا الموقع ، لذا شكرًا لك على القراءة وجميع الإجابات التي تقدمها! (أعتذر عن اللغة الإنجليزية ، أنا إيطالي)

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

المحلول

إذا كان الأمر بمثابة مشروع "بحث" فقط تريد استكشاف كيفية عمل هذا التمديد ، فيمكنك توفير تنفيذك الخاص لـ Object صف دراسي. ما عليك سوى نسخ تطبيق الكائن الحالي ، أضف الخاص بك setRole الطريقة وما إلى ذلك ، وتعطي -Xbootclasspath:.:/usr/lib/jvm/java-6-sun/jre/lib/rt.jar كمعلمة إلى أمر جافا. (سأبحث عن فئة API في . قبل النظر في الواقع rt.jar.)

نصائح أخرى

يجب أن تفكر في استخدام التكوين بدلاً من الميراث لحل هذه المشكلة ؛ وبهذه الطريقة ، يمكنك توفير الوظيفة التي تحتاجها دون استخدام "طلقة واحدة" في الميراث.

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

public class MyClass extends MySuperClass {
  private final PropertyChangeSupport support;

  public MyClass() {
    this.support = new PropertyChangeSupport(this);
  }

  public void addPropertyChangeListener(PropertyChangeListener l) {
    support.addPropertyChangeListener(l);
  }

  protected void firePropertyChangeEvent() {
    PropertyChangeEvent evt = new ...
    support.firePropertyChangeEvent(evt);
  }
}
  • يمكنك تمديد Object - كل فصل يمتدها.
  • يبدو أنك بحاجة إلى شيء مثل الميراث المتعدد - لا يوجد شيء في جافا
  • إذا كنت ترغب في إضافة وظيفة ، استخدم تكوين الكائن. بمعنى آخر،

    YourClass extends Whatever implements ObjectWithRoles {
        private RoleHandler roleHandler;
        public RoleHandler getRoleHandler() {..} // defined by the interface
    }
    

ثم يتم وضع جميع الطرق في RoleHandler

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

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

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

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

أيضًا ، كما تم الإشارة إليه في التعليقات ، يتم الإعلان عن سلسلة "نهائية" ، وبالتالي لا يمكن تمديدها. لذلك ، يجب أن تفكر حقًا في حل يمكنك من خلاله تفويض/تزيين الكائنات. على سبيل المثال ، قد يكون لديك بعض الكائنات التي تلتف سلسلة وتوفر الوصول إلى السلسلة عبر GetString () أو ToString () ، ولكن بعد ذلك يضيف الوظيفة الإضافية أعلى فئة السلسلة.

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

ما تريد فعله حقًا سيكون ترقيع القرد, ، أي تغيير سلوك الفئات الموجودة دون تعديل التعليمات البرمجية الخاصة بهم.

لسوء الحظ ، لا تدعم Java هذا ، ولا أشياء مثل Mixins يمكن استخدامها بدلاً من ذلك. لذلك ما لم تكن على استعداد للتبديل إلى لغة أكثر ديناميكية مثل Groovy ، فسيتعين عليك العيش مع حلول أقل أناقة مثل التكوين.

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