Frage

, fragte ich eine Frage über Schnittstellen vorher und bekam einige hervorragende Antworten. Ich bin wirklich begeistert wirklich flexible Code zu entwickeln beginnen.

Ich habe jetzt eine Frage über eine virtuelle Methode überschrieben.

Zur Zeit arbeite ich mit dem Community Server SDK. Einer der Kontrollen ist ein ‚Tag‘ Brotkrümel. So wird es die ‚Tags‘ Liste auf dem entsprechenden Objekt.

<CSBlog:TagBreadCrumb />

Ich bin mit Tags adminstrators zu ermöglichen, bestimmte Stellen gezielt nach Inhalten in einem Layout zu erscheinen, aber diese Tags an den Endverbraucher nicht relevant sind. Zum Beispiel wird ‚Home_Main‘ Tag verwendet, um das Hauptfeldes auf der Homepage zum Ziel, aber ich weiß nicht Benutzer wünschen, das zu sehen.

Da ich das SDK für Community Server habe, fand ich die Kontrolle, die die ‚Tag-Liste‘ und Modifikationen daran macht, das zu tun, was ich will - aber mein Verständnis ist, dass es nicht gut ist, den Kern aus vielen Gründen zu ändern.

Also, was ich möchte, ist meine eigene Kontrolle tun zu schaffen, das im wesentlichen nahezu 100% identisch mit der Basissteuerung ist, sondern eine Methode außer Kraft setzen.

Hier ist die Methode:

 public virtual string FormatTags(string[] tagList)

Innerhalb von dort Code ist die Tags zu formatieren, und ich möchte meinen eigenen Code schreiben, die alle aus dem gleichen Stoff tut, außer prüft eine Konfigurationsdatei für ‚Tags‘ auszuschließen.

Also mein Verständnis ist, dass ich meine Kontrolle zu schaffen, von der Basissteuerung abzuleiten - und ich kann meine eigene FormatTags () -Methode schreibe - ist das richtig

Ich brauche nur einen Aspekt davon zu ändern, aber nicht das, dass ich den ursprünglichen Code für diese Methode von der Basisklasse kopieren - und ändern, was ich brauche in dort? Es funktioniert einfach nicht das Gefühl, Recht copyign Code von einer Stelle, aber ich weiß nicht, von einem anderen Weg, um das Verfahren zu verlängern, ohne Code in der Basisklasse zu ändern.

Vielen Dank für alle Vorschläge.

War es hilfreich?

Lösung

Sie können immer noch die abgeleitete Methode laufen und auf seine Ergebnisse arbeiten:

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

Andere Tipps

In Ihrem Fall (Wo Sie bestimmte Tags aus, die gedruckt in den Brotkrumen zu unterdrücken wollen), würden Sie alle speziellen Tags abzustreifen, bevor die Basismethode aufrufen.

So Ihr Code würde in etwa so aussehen:

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

Auf diese Weise müssen Sie nicht verstehen, wie die Basisklasse formatiert die Ausgabezeichenfolge.

Wenn Sie stattdessen das Format der Ausgabezeichenfolge ändern will, würden Sie keine Anrufe an die Basismethode machen (Da diese Methode könnte es Formatierung in zukünftigen Versionen werden zu ändern, die Sie wollen nicht von betroffen sein ).

  

Also mein Verständnis ist, dass ich meine Kontrolle zu schaffen, von der Basissteuerung abzuleiten - und ich kann meine eigene FormatTags () -Methode schreibe - ist das richtig

Das ist richtig; wenn Sie außer Kraft setzen, bieten Sie Ihre eigene Implementierung einer Methode der Basisklasse.

Im besten Fall, eine von zwei Dingen passieren:

  • Es gibt eine einfache Möglichkeit, die Ausgabe der Basisklasse Methode in das gewünschten Ergebnis.

  • zu transformieren
  • Die Basisklasse eines Strategie-Muster oder eine Variante davon verwendet, so dass Sie einfach eine alternative Implementierung des entsprechenden Teils der Strategie liefern.

Leider ist es nicht klingen wie entweder von denen hier der Fall ist, so können Sie es von Grund auf neu zu schreiben.

  

Also mein Verständnis ist, dass ich schaffen   meine Kontrolle, von der Basis Ableiten   Kontrolle - und ich kann meine eigene schreiben   FormatTags () -Methode - ist das richtig

Absolut richtig.

Wenn Sie finden, dass Sie benötigen eine Menge Code zu kopieren um, sollten Sie bei der Umstrukturierung Ihrer Methode zu suchen. Setzen Sie den Code, der in eine andere Methode kopiert wird ist, dass Sie nicht außer Kraft setzen, und dann, wenn Sie FormatTags außer Kraft setzen, ändern, was Sie brauchen, um und greifen nur, dass Code, den Sie durch den Aufruf der anderen Methode kopiert haben würde.

Schauen Sie sich auf Erweiterungsmethoden . Diese ermöglichen es Ihnen die Möglichkeit einer versiegelten Klasse zu erweitern, die Sie nicht bearbeiten oder erweitern, indem Sie Ihre Funktion in Ihrem eigenen statischen Klasse zu definieren. Hier ist ein Beispiel, das ich gerade geschrieben habe (können Syntaxfehler haben).

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

Nun, auf diese zuzugreifen, kann ich rufen Sie einfach an:

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

string myResult = myString.AppendCrazyText(myCrazyText);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top