جافا ما يعادل الكاكاو المندوبين / الهدف-C غير رسمية البروتوكولات ؟

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

سؤال

ما هو جافا ما يعادل الكاكاو المندوبين ؟

(أنا أفهم أن أنا يمكن أن يكون لها واجهة مرت إلى فئة ، تلك الفئة استدعاء الأساليب المناسبة ، ولكن أنا أتساءل عما إذا كان هناك أي وسيلة أخرى لتحقيق شيء ما أقرب إلى الكاكاو/الهدف-C غير الرسمية البروتوكولات)

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

المحلول

الجواب القصير هو لا يوجد شيء في جافا أقرب ما تريد, ولكن هناك بدائل.مندوب نمط ليس من الصعب أن تنفذ ليس تماما كما مريحة كما يفعل ذلك مع الهدف-C.

السبب "غير رسمية البروتوكولات" العمل في الهدف-C لأن اللغة يدعم فئات, التي تسمح لك لإضافة الأساليب القائمة الطبقات دون subclassing لهم ، أو حتى بعد الوصول إلى التعليمات البرمجية المصدر.وبالتالي فإن معظم البروتوكولات الرسمية هي فئة على NSObject.هذا من المستحيل بوضوح في جاوة.

الهدف-C 2.0 اختارت @البروتوكول الاختياري الأساليب التي هي أكثر نظافة التجريد و يفضل رمز جديد ، ولكن أبعد من ذلك من وجود ما يعادلها في جافا.

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

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

نصائح أخرى

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

public class MyClass {

    private MyClassDelegate delegate;

    public MyClass () {

    }

    // do interesting stuff

    void setDelegate(MyClassDelegate delegate) {
        this.delegate = delegate;
    }

    interface MyClassDelegate {
        void aboutToDoSomethingAwesome();
        void didSomethingAwesome();
    }

    class MyClassDelegateAdapter implements MyClassDelegate {

        @Override
        public void aboutToDoSomethingAwesome() {
            /* do nothing */
        }

        @Override
        public void didSomethingAwesome() {
            /* do nothing */
        }
    }
}

وبعد ذلك يمكن للشخص أن يأتي على طول ومجرد تنفيذ الاشياء التي تهمهم:

class AwesomeDelegate extends MyClassDelegateAdapter {

    @Override
    public void didSomethingAwesome() {
        System.out.println("Yeah!");
    }
}

وإما أن، أو انعكاس داعيا "المعروفة" طرق نقية. ولكن هذا جنون.

وليس هناك شيء يمنعك من استخدام نمط مندوب في كائنات جافا (انها مجرد ليست نمطا التي يشيع استخدامها في JDK كما هي في الكاكاو). يكون مجرد ايفار delegate من النوع الذي يتوافق مع واجهة WhateverDelegate الخاص بك، ثم في أساليب المثيل الذي تريد تفويض، إعادة توجيه استدعاء الأسلوب على الكائن مندوب إذا كان موجودا. ربما كنت في نهاية المطاف مع شيء يبدو الكثير مثل هذا ، إلا في جافا بدلا من الكائنات C.

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

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