Подкласс C # с тем же методом - PullRequest
2 голосов
/ 09 марта 2009

У меня есть суперкласс с двумя подклассами. Оба подкласса имеют метод с проверкой наличия содержимого главы. Для подкласса 1 это метод HasContent (int chapterID), а для подкласса 2 это HasContent (int chapterID, int institu) Как видите, подкласс 2 имеет дополнительный параметр. Цель обоих методов одинакова.

Я думал поместить метод HasContent в суперкласс. Как вы думаете, мне нужно это сделать? Если да, то как мне это реализовать? Или более разумно поместить оба метода в их собственный подкласс?

EDIT:

Тело HasDocuments выглядит так: Subclass1:

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

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

Subclass2:

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

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

Ответы [ 4 ]

6 голосов
/ 09 марта 2009

Изменить: Обновлено в соответствии с вопросом обновления.

Поскольку у вас явно одинаковая логика в обоих методах, я бы изменил ее следующим образом:

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);
    }
}
1 голос
/ 08 июля 2009

Используйте перегрузку методов, поместив два метода с одинаковыми именами с разными аргументами в суперкласс. Когда вы вызываете 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;
}
0 голосов
/ 09 марта 2009

Поскольку HasContent () принимает разные дополнения, я бы не переместил его в базовый класс, тот факт, что два метода вызываются одинаково, не означает, что они делают одно и то же.

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

0 голосов
/ 09 марта 2009

Вы сказали:

Цель обоих методов одинакова

так что да, звучит так, что у вас есть общий метод, который вы можете поместить в суперкласс.

...