Вопрос

У меня есть суперкласс с двумя подклассами.Оба подкласса имеют метод, проверяющий наличие содержания в главе.Для подкласса 1 этот метод — HasContent(int ChapterID), а для подкласса 2 — HasContent(int ChapterID, int Institution).Как видите, подкласс 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() принимает разные дополнения, я бы не стал перемещать его в базовый класс: тот факт, что два метода называются одинаково, не означает, что они делают одно и то же.

Я не знаю ни вашей кодовой базы, ни того, что делает система, над которой вы работаете, однако, учитывая ту небольшую информацию, которой я располагаю, кое-что о вашем проекте чувствует неправильно.В прошлом я обнаружил, что часто возникающие у меня проблемы с дизайном возникают из-за другой проблемы, связанной с моделью данных.Извините, не могу найти помощь, если вы не можете изменить остальную часть системы….

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top