سؤال

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

Interface A {
    void doX();
}

abstract Class B implements A {
    protected void commonY() {
        // ...
    }

    @Override
    public abstract void doX();
}

Class C extends B {
    @Override
    public void doX() {
        // ...
    }
}

Class D extends B {
    @Override
    public void doX() {
        // ...
    }
}

قانون بلدي يعمل كما هو متوقع ، ولكن لدي بعض الأسئلة:

  • يجب أن تعلن الأسلوب التجريدي دوكس() في الفئة "ب" ؟ لماذا (لا) ؟

  • يجب أيضا أن تعلن صراحة "تنفذ" على فئة C و D ؟ لماذا (لا) ؟

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

المحلول

أعتقد أنه سيكون من الأفضل أن تفعل ذلك على النحو التالي:

Interface A {
        void doX();
}

abstract Class B {
        protected void commonY() {
                // ...
        }
}

Class C extends B implements A{

        public void doX() {
                // ...
        }
}

Class D extends B implements A{

        public void doX() {
                // ...
        }
}

لا يجب خلط واجهة (التوقيع طرق) مع التنفيذ.

نصائح أخرى

  • يجب أن تعلن الأسلوب التجريدي دوكس() في الفئة "ب" ؟ لماذا (لا) ؟

لا.انها فئة مجردة - تحديد واجهة يعني أن جميع الفئات الفرعية سوف تحتاج إلى تنفيذ تلك الأساليب.وبعبارة أخرى, انها زائدة عن الحاجة.

  • يجب أيضا أن تعلن صراحة "تنفذ" على فئة C و D ؟ لماذا (لا) ؟

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

أنا مجرد رمي في خيار آخر.

بدوره خلاصة الدرجة B في AUtil الفئة التي لا تنفذ A.طريقة التوقيعات قد تتطلب حجة إضافية من نوع للعمل مع.

C و D تنفذ ، مثيل AUtil داخليا.هذا لا يسمح C و D تمديد الطبقات الأخرى.

أنا أتفق مع JeeBee:النظر في تنفيذ المساعد الخاص بك أساليب مكان آخر غير مجردة الفئة الأساسية.

إذا كان المساعد الخاص بك طريقة commonY() موجود فقط في الفئة الأساسية مجردة ب, جميع الطبقات التي تنفذ واجهة سيكون لديك أيضا توسيع قاعدة فئة B من أجل الاستفادة من تنفيذ commonY().ولكن قد لا يريدون دائما أن يضطر إلى تمديد فئة B.

أيضا ما إذا كنت ترغب في تغيير تنفيذ commonY() في المستقبل ؟ ثم سوف تؤثر على الكثير من تطبيقات واجهة A.ولكن إذا كنت لا السيطرة على جميع هذه التطبيقات من واجهة ، قد تؤثر على وظيفة (في مزاج سيء) دون أن ندرى.

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

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

الميراث هو متعدية.أنت لا تحتاج إلى كتابة تلك الفئة C تنفذ واجهة إن الفئة C تستمد فئة B التي تنفذ واجهة A.ومع ذلك ، ليس هناك الكثير من الضرر إما.

وأود أن لا تعلن doX() في B و لا تضيف "implements A"على C و D لأنه يجب أن لا تكرر نفسك.

الملخص doX() في B لا يضيف شيئا ، كما تم تحديدها بالفعل من قبل "implements A".نفس الشيء صحيح بالنسبة مضيفا "implements A"إلى C و D.

الوحيد الممكن استخدام هذه الشروط أن تكون الوثائق:إذا كنت تريد أن تجعل صريحة جدا أن C (أو D) هو- A, ثم يمكنك إضافة implements, ولكن يجب أن تكون على علم أنه حقا لا يهم إلى مترجم.

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