Question

J'ai déjà posé une question sur les interfaces et obtenu d'excellentes réponses. Je suis vraiment ravi de commencer à développer un code vraiment flexible.

J'ai maintenant une question sur le remplacement d'une méthode virtuelle.

Je travaille actuellement avec le SDK du serveur de communauté. L'un des contrôles est une miette de pain «tag». Donc, il va lister les "tags" sur l'objet concerné.

<CSBlog:TagBreadCrumb />

J'utilise des balises pour permettre aux administrateurs de cibler des zones spécifiques pour que le contenu apparaisse dans une présentation, mais ces balises ne concernent pas l'utilisateur final. Par exemple, la balise 'Home_Main' est utilisée pour cibler le panneau principal de la page d'accueil, mais je ne souhaite pas que l'utilisateur le voie.

Depuis que j'ai le SDK pour Community Server, j'ai trouvé le contrôle qui rend la "liste de balises" et y a apporté des modifications qui font ce que je veux. Cependant, je crois comprendre qu'il n'est pas bon de modifier le noyau pour plusieurs raisons.

Donc, ce que je voudrais faire est de créer mon propre contrôle, qui est pratiquement identique à 100% au contrôle de base, mais remplace une méthode.

Voici la méthode:

 public virtual string FormatTags(string[] tagList)

À l'intérieur de, il y a du code pour formater les balises, et j'aimerais écrire mon propre code qui fait tout le même travail, sauf que le fichier de configuration recherche les balises à exclure.

Donc, si j'ai bien compris, je crée mon contrôle à partir du contrôle de base - et je peux écrire ma propre méthode FormatTags () - est-ce correct?

Je n'ai besoin que de modifier un aspect de celui-ci, mais cela signifie-t-il que je dois copier le code d'origine de cette méthode à partir de la classe de base - et modifier ce dont j'ai besoin ici? Cela ne donne pas l'impression que le code de copie est correct à un endroit, mais je ne connais pas d'autre moyen d'étendre la méthode sans changer de code dans la classe de base.

Merci pour vos suggestions.

Était-ce utile?

La solution

Vous pouvez toujours exécuter la méthode dérivée et exploiter ses résultats:

public override string FormatTags(string[] tagList) {
    string result = base.FormatTags(tagList);
    // do something with result
    return result;
}

Autres conseils

Dans votre cas (où vous souhaitez empêcher l'impression de certaines balises dans la chapelure), vous devez supprimer toutes les balises spéciales avant d'appeler la méthode de base.

Votre code ressemblerait donc à quelque chose comme:

public override string FormatTags(string[] tagList)
{
  // strip special tags
  string[] newTagList = stripTags(tagList);
  return base.FormatTags(newTagList);
}

De cette façon, vous n'avez pas besoin de comprendre comment la classe de base formate la chaîne de sortie.

Si vous vouliez plutôt modifier le format de la chaîne de sortie, vous ne feriez aucun appel à la méthode de base (cette méthode pouvant modifier sa mise en forme dans les versions à venir, ce sur quoi vous ne souhaitez pas être affecté. ).

  

Donc, si j'ai bien compris, je crée mon contrôle à partir du contrôle de base - et je peux écrire ma propre méthode FormatTags () - est-ce correct?

C'est vrai. lorsque vous remplacez, vous fournissez votre propre implémentation de la méthode d'une classe de base.

Dans le meilleur des cas, l'une des deux choses suivantes se produit:

  • Il existe un moyen simple de transformer la sortie de la méthode de la classe de base en résultat souhaité.

  • La classe de base utilise un modèle de stratégie ou une variante de celui-ci, il vous suffit donc de fournir une autre implémentation de la partie appropriée de la stratégie.

Malheureusement, cela ne semble pas être le cas ici, vous devrez donc peut-être l'écrire à partir de zéro.

  

Donc, ma compréhension est que je crée   mon contrôle, dérivant de la base   contrôle - et je peux écrire mon propre   Méthode FormatTags () - est-ce correct?

Absolument correct.

Si vous constatez que vous devez copier beaucoup de code, vous devez envisager de restructurer votre méthode. Placez le code copié dans une autre méthode que vous ne substituez pas, puis lorsque vous substituez FormatTags, modifiez ce dont vous avez besoin et accédez simplement au code que vous auriez copié en appelant l'autre méthode.

Consultez les méthodes d'extension . Celles-ci vous permettent d'étendre les capacités d'une classe scellée que vous ne pouvez ni éditer ni étendre en définissant votre fonction dans votre propre classe statique. Voici un exemple que je viens d'écrire (il peut y avoir des erreurs de syntaxe).

public static class MyExtensions
{
    public static string AppendCrazyText(this string s, string crazyText)
    {
        return s + crazyText;
    }
}

Maintenant, pour y accéder, je peux simplement appeler:

string myString = "Hello world";
string myCrazyText = ", lets go crazy!";

string myResult = myString.AppendCrazyText(myCrazyText);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top