سؤال

لدي فئة فائقة مع فئتين فرعيتين.لدى كلا الفئتين الفرعيتين طريقة للتحقق مما إذا كان الفصل يحتوي على محتوى.بالنسبة للفئة الفرعية 1، هذه الطريقة هي HasContent(int ChapterID) وبالنسبة للفئة الفرعية 2، هذه الطريقة هي HasContent(int ChapterID, int Foundation).كما ترون، تحتوي الفئة الفرعية 2 على معلمة إضافية.والغرض من كلا الطريقتين هو نفسه.

كنت أفكر في وضع طريقة HasContent في الطبقة الفائقة.هل تعتقد أنني بحاجة للقيام بذلك؟إذا كان الأمر كذلك، كيف يجب أن أقوم بتنفيذ ذلك؟أم أنه من الحكمة وضع كلتا الطريقتين في فئة فرعية خاصة بهما؟

يحرر:

يبدو نص HasDocuments كما يلي:فئة فرعية 1:

Database DB = new Database();
int res = DB.ExecuteSpRetVal(chapterID, mInstitutionID);

if (res > 0)
    return true;
else
    return false;

فئة فرعية 2:

Database DB = new Database();
int res = DB.ExecuteSpRetVal(chapterID);

if (res > 0)
    return true;
else
    return false;
هل كانت مفيدة؟

المحلول

يحرر: تم التحديث وفقًا لتحديث السؤال.

نظرًا لأنه من الواضح أن لديك نفس المنطق تقريبًا في كلتا الطريقتين، سأعيد تشكيله على النحو التالي:

abstract class SuperClass
{
    protected bool HasContentImpl(int chapterID, int institution)
    {
        Database db = new Database();
        int result;

        if (institution >= 0) // assuming negative numbers are out of range
            result = db.ExecuteSpRetVal(chapterID, institution);
        else
            result = db.ExecuteSpRetVal(chapterID);

        return result > 0;
    }
}

class SubClass1 : SuperClass
{
    public bool HasContent(int chapterID)
    {
        return base.HasContentImpl(chapterID, -1);
    }
}

class SubClass2 : SuperClass
{
    public bool HasContent(int chapterID, int institution)
    {
        return base.HasContentImpl(chapterID, institution);
    }
}

نصائح أخرى

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

protected bool HasContent(int chapterID, int institution)
{
    Database db = new Database();
    int result;

    result = db.ExecuteSpRetVal(chapterID, institution);

    return result > 0;
}

protected bool HasContent(int chapterID)
{
    Database db = new Database();
    int result;

    result = db.ExecuteSpRetVal(chapterID);

    return result > 0;
}

وقال لك:

<اقتباس فقرة>   

والغرض من الطريقتين هو نفسه

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

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

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

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