Question

J'ai une super-classe avec deux sous-classes. Les deux sous-classes ont une méthode avec vérifie si un chapitre a un contenu. Pour la sous-classe 1, cette méthode est HasContent (int chapterID) et pour la sous-classe 2, il s'agit de HasContent (int chapterID, int institution). Comme vous pouvez le constater, la sous-classe 2 a un paramètre supplémentaire. Le but des deux méthodes est le même.

Je pensais mettre la méthode HasContent dans la super-classe. Pensez-vous que je dois faire cela? Si oui, comment devrais-je implémenter cela? Ou est-il plus judicieux de mettre les deux méthodes dans leur propre sous-classe?

EDIT:

Le corps de HasDocuments ressemble à ceci: Sous-classe 1:

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

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

Sous-classe 2:

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

if (res > 0)
    return true;
else
    return false;
Était-ce utile?

La solution

Modifier: mis à jour en fonction de la mise à jour de la question.

Etant donné que vous avez clairement presque la même logique dans les deux méthodes, je le reformulerais comme ceci:

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

Autres conseils

Utilisez la surcharge de méthode en plaçant deux méthodes portant le même nom avec des arguments différents dans la superclasse. Lorsque vous appelez HasContent, il utilisera celui qui correspond au nombre et aux types d'arguments que vous avez fournis. Comme il se trouve dans la super-classe, vous n’aurez plus besoin de le copier si vous décidez plus tard de créer une nouvelle sous-classe qui utilise également cette méthode. Voir ci-dessous un exemple de code.

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

Vous avez dit:

  

Les deux méthodes ont le même objectif

Alors oui, il semble que vous ayez une méthode commune que vous pouvez mettre dans la superclasse.

Comme HasContent () prend des augmentations différentes, je ne le ferais pas passer à la classe de base, le fait que deux méthodes s'appellent la même chose ne signifie pas qu'elles font la même chose.

Je ne connais pas votre base de code ni le système sur lequel vous travaillez, mais compte tenu du peu d'informations dont je dispose, quelque chose au sujet de votre conception a l'air . J'ai constaté par le passé que, souvent, lorsque je rencontrais ce type de problème de conception, c'était dû à un autre problème de modélisation des données. Désolé, ne correspond pas à l’aide si vous ne pouvez pas changer le reste du système & # 8230;.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top