سؤال

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

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

المحلول

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

في شبه كود:

interface BusinessLogicInterace
{
    void method1();
    void method2();
}

class BusinessLogic implements BusinessLogicInterface
{
    void method1() { ... }
    void method2() { ... }
}

class User 
    extends OtherClass 
    implements BusinessLogicInterface
{
    BusinessLogic logic = new BusinessLogic();

    @Override
    void method1() { logic.method1(); }

    @Override
    void method2() { logic.method2(); }
}

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

نصائح أخرى

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

هل الكائن خالصة تثير فيك اليوم؟

وتعتقد أنك يمكن أن تفعله مع قليلا <م> البرمجة الموجهة مركب؟

وبعد ذلك لكم، يا سيدي، يبحثون عن أباتشي جيناء (سابقا Qi4J أو الحماس)؛)

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

هل يمكن أن تحاول محاكاة mixins من خلال التركيبة: فئة جافا يمكن تحديد المتغيرات الأعضاء التي تمثل الفئات الأخرى التي تؤدي بعض منطق الأعمال المشترك

.

في تصميم فئات Java، لم أجد عدم وجود C ++ أسلوب وراثة متعددة لمنع تصميم الهندسة المعمارية بلدي. سوف تجد وسيلة لتحقيق ما تريد القيام به.

وQI4J يتيح لك استخدام mixins

ويمكنك استغلال حقيقة أن واجهات تسمح الطبقات المتداخلة (العامة تلقائيا ثابت) للحفاظ على تطبيق الافتراضي الطرق واجهة مغلفة ضمن واجهة نفسه. بمعنى آخر. نقل الطبقة BusinessLogic المثال اليكس B في داخل واجهة.

وهذا هو مماثل لطريقة سكالا يولد رمز JVM لصفات كما هو موضح هنا <لأ href = "https://stackoverflow.com/questions/2557303/how-are-scala-traits-compiled-into-java- بايت كود "> كيف يتم الصفات سكالا تجميعها في جافا بايت كود؟

وعندما نفعل ذلك على سبيل المثال يصبح:

interface BusinessLogicInterface {
    void method0();

    class DefaultImpl {
        private DefaultImpl() {
        }

        public static void method1(BusinessLogicInterface self) { ... }
        public static void method2(BusinessLogicInterface self) { ... }
    }

    void method1();
    void method2();
}

class User extends OtherClass implements BusinessLogicInterface {
    @Override
    void method0() { ... }

    @Override
    void method1() { BusinessLogic.defaultImpl.method1(this); }

    @Override
    void method2() { BusinessLogic.defaultImpl.method2(this); }
}

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

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

وتنفيذ mixin بسيط / الصفات تدعم في جافا باستخدام CGLib / javassit في غاية السهولة. يمكنك إلقاء نظرة على سبيل المثال href="http://justonjava.blogspot.com/2011/10/mixins-aka-traits-implementation-in.html" هنا ل مثال صغير. أكثر اكتمالا، وعلى استعداد لاستخدام الحل يمكن العثور عليها هنا

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

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