Pregunta

Tengo una superclase con dos subclases. Las dos subclases tienen un método con el que se comprueba si un capítulo tiene contenido. Para la subclase 1, este método es HasContent (int chapterID) y para la subclase 2 es HasContent (int chapterID, int Institution). Como puedes ver, la subclase 2 tiene un parámetro extra. El propósito de ambos métodos es el mismo.

Estaba pensando en poner el método HasContent en la superclase. ¿Crees que necesito hacer esto? Si es así, ¿cómo debo implementar esto? ¿O es más sabio poner ambos métodos en su propia subclase?

EDITAR:

El cuerpo de HasDocuments se ve así: Subclase 1:

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

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

Subclase2:

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

if (res > 0)
    return true;
else
    return false;
¿Fue útil?

Solución

Editar: actualizado de acuerdo con la actualización de la pregunta.

Ya que claramente tienes casi la misma lógica en ambos métodos, lo refactorizaría así:

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

Otros consejos

Use la sobrecarga de métodos colocando dos métodos con nombres idénticos con diferentes argumentos en la superclase. Cuando llame a HasContent, utilizará el que coincida con el número y los tipos de argumentos que haya proporcionado. Debido a que está en la superclase, ahora no tendrá que hacer una copia más si decide más adelante crear una nueva subclase que también use este método. Vea a continuación el código de ejemplo;

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

Has dicho:

  

El propósito de ambos métodos es el mismo

entonces sí, parece que tienes un método común que puedes poner en la superclase.

Como HasContent () toma aumentos diferentes, no lo movería a la clase base, el hecho de que dos métodos se llamen iguales, no significa que hagan lo mismo.

No sé cuál es su base de código o qué hace el sistema en el que está trabajando, sin embargo, dada la poca información que tengo, algo sobre su diseño se siente . He encontrado en el pasado que a menudo, cuando tengo este tipo de problema de diseño, se debe a un problema en el que se modelan los datos. Lo sentimos, no coincide con la ayuda si no puede & # 8217; t cambiar el resto del sistema & # 8230 ;.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top