سؤال

واجهة هو 100% خلاصة الدرجة ، حتى نتمكن من استخدام واجهة البرمجة الفعالة.هل هناك أي حالة حيث فئة مجردة هو أفضل من واجهة ؟

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

المحلول

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

واجهات لا يمكن أن تحتوي أيضا.

نصائح أخرى

نعم ، هناك مكان لكل فئات مجردة و الواجهات.

دعونا نذهب مع مثال ملموس.ونحن سوف ننظر في كيفية جعل CheckingAccount و SavingsAccount من مجردة AbstractBankAccount و نرى كيف يمكننا استخدام واجهة التفريق بين نوعين من الحسابات.

لتبدأ هنا فئة مجردة AbstractBankAccount:

abstract class AbstractBankAccount
{
    int balance;
    public abstract void deposit(int amount);
    public abstract void withdraw(int amount);
}

لدينا رصيد الحساب كما balance و الطريقتين deposit و withdraw التي يجب أن تنفذ من قبل الفئات الفرعية.

كما يمكننا أن نرى ، فئة مجردة تعلن هيكل كيفية الحسابات المصرفية يجب أن تكون محددة.كما @Uri يذكر في رده هناك الدولة هذه خلاصة الدرجة التي هو balance الحقل.هذا لن يكون ممكنا مع واجهة.

الآن, دعونا فرعية AbstractBankAccount لجعل CheckingAccount

class CheckingAccount extends AbstractBankAccount
{
    public void deposit(int amount)
    {
        balance += amount;
    }

    public void withdraw(int amount)
    {
        balance -= amount;
    }
}

في هذه الفئة الفرعية CheckingAccount, قمنا بتنفيذ اثنين من فئات مجردة -- لا شيء أكثر إثارة للاهتمام هنا.

الآن كيف يمكننا تنفيذ SavingsAccount?الأمر يختلف من CheckingAccount في أنها سوف كسب الفائدة.الفائدة يمكن زيادتها باستخدام deposit طريقة, ولكن بعد ذلك مرة أخرى, انها ليست كما لو كان العميل إيداع مصلحة نفسه/نفسها.ولذلك قد يكون أكثر وضوحا إذا كان لدينا وسيلة أخرى إضافة المال في الحساب خصيصا الفائدة ، أقول ، accrueInterest الأسلوب.

يمكننا مباشرة في تنفيذ طريقة في SavingsAccount, لكن قد يكون لدينا أكثر من حساب البنك الأنواع التي يمكن أن تتحقق الفائدة في المستقبل ، لذلك قد ترغب في جعل InterestBearing واجهة لديه accrueInterest الطريقة:

interface InterestBearing
{
    public void accrueInterest(int amount);
}

الآن نحن يمكن أن تجعل SavingsAccount الدرجة التي يمكن الحصول على فائدة من خلال تنفيذ InterestBearing واجهة:

class SavingsAccount extends AbstractBankAccount implements InterestBearing
{
    public void deposit(int amount)
    {
        balance += amount;
    }

    public void withdraw(int amount)
    {
        balance -= amount;
    }

    public void accrueInterest(int amount)
    {
        balance += amount;
    }
}

الآن إذا كنا نريد أن نجعل نوع آخر من حساب أقول PremiumSavingsAccount, نحن يمكن أن تجعل فئة فرعية من AbstractBankAccount وتنفيذ InterestBearing واجهة إلى أخرى بفائدة الحساب.

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

إذن هناك بالفعل الأماكن لكل فئات مجردة واجهات التعايش والعمل معا في حالة واحدة.

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

هذه المقالة تقدم شرح مفصل حول هذا الموضوع.

هناك بضعة أسباب لماذا قد تفضل تنفيذ خالية من فئة مجردة على واجهة:

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

ولكن من ناحية أخرى ، واجهة جافا الكلمة يسمح نظافة المصدر.

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

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

وهكذا جافا يوفر واجهة قائمة، وAbstractList مجردة الفئة الأساسية إلى "تقليل الجهد اللازم لتنفيذ" واجهة ...

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