Pergunta

Eu tenho uma superclasse com duas subclasses. As duas subclasses ambos têm um método com verifica se um capítulo tem conteúdo. Para uma subclasse este método é HasContent (int chapterID) e para subclasse 2 este é HasContent (int chapterID, instituição int). Como você pode ver subclasse 2 tem um parâmetro extra. A finalidade de ambos os métodos, é a mesma.

Eu estava pensando para colocar o HasContent método na superclasse. Você acha que eu preciso fazer isso? Se sim, como eu deveria implementar isso? Ou é mais sabiamente para colocar ambos os métodos em sua própria subclasse?

EDIT:

O corpo de HasDocuments parece com isso: 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;
Foi útil?

Solução

Editar:. Atualizado de acordo com a atualização questão

Uma vez que você está tendo claramente quase a mesma lógica em ambos os métodos, eu refatorar-lo assim:

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);
    }
}

Outras dicas

Use método de sobrecarga, colocando dois métodos com nomes idênticos com diferentes argumentos para a superclasse. Quando você chama HasContent, ele irá usar qualquer um correspondem ao número e tipos de argumentos que você forneceu. Porque é na superclasse, agora você não terá que fazer mais uma cópia do mesmo se você decidir mais tarde para fazer uma nova subclasse que usa esse método também. Veja abaixo para exemplo de código;

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;
}

Você disse:

O objetivo de ambos os métodos é a mesma

Então, sim, ele faz sons que você tem um método comum que você pode colocar na superclasse.

Como HasContent () assume diferentes aumenta eu não movê-lo para a classe base, o fato de que dois métodos são chamados a mesma, não significa que eles fazem a mesma coisa.

Eu não sei a sua base de código ou que o sistema que está a trabalhar faz, contudo, dada a pouca informação que tenho, algo sobre o seu projeto sente wronge. Eu descobri no passado que muitas vezes quando eu tenho esse tipo de problema de projeto, é devido a um problema mais onde na forma como os dados são modelo. Desculpe não corresponder ajuda se você não pode mudar o resto do sistema ....

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top