Domanda

Ho fatto una domanda sulle interfacce in precedenza e ho ottenuto delle risposte eccellenti. Sono davvero entusiasta di iniziare a sviluppare un codice davvero flessibile.

Ora ho una domanda sull'override di un metodo virtuale.

Attualmente sto lavorando con l'SDK di Community Server. Uno dei controlli è una briciola di pane "tag". Quindi elencherà i "tag" sull'oggetto rilevante.

<CSBlog:TagBreadCrumb />

Sto utilizzando i tag per consentire agli amministratori di scegliere come target punti specifici per la visualizzazione del contenuto in un layout, tuttavia tali tag non sono rilevanti per l'utente finale. Ad esempio, il tag "Home_Main" viene utilizzato come target del pannello principale nella home page, ma non voglio che l'utente lo veda.

Dato che ho l'SDK per Community Server, ho trovato il controllo che rende la 'lista di tag' e ne ho apportato delle modifiche che fanno quello che voglio - tuttavia la mia comprensione è che non è bene modificare il core per molte ragioni.

Quindi quello che mi piacerebbe fare è creare il mio controllo, che è sostanzialmente identico quasi al 100% al controllo di base, ma sovrascrive un metodo.

Ecco il metodo:

 public virtual string FormatTags(string[] tagList)

All'interno c'è un codice per formattare i tag, e mi piacerebbe scrivere il mio codice che fa tutte le stesse cose, tranne che controlla un file di configurazione per escludere 'tags'.

Quindi la mia comprensione è che creo il mio controllo, derivante dal controllo di base - e posso scrivere il mio metodo FormatTags () - è corretto?

Devo solo cambiarne un aspetto, ma questo significa che devo copiare il codice originale per quel metodo dalla classe base - e cambiare quello di cui ho bisogno? Semplicemente non sembra giusto il codice copyign da un punto, ma non conosco un altro modo per estendere il metodo senza modificare il codice nella classe base.

Grazie per eventuali suggerimenti.

È stato utile?

Soluzione

Puoi ancora eseguire il metodo derivato e operare sui suoi risultati:

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

Altri suggerimenti

Nel tuo caso (dove vuoi sopprimere determinati tag dalla stampa nel pangrattato), elimineresti tutti i tag speciali prima di chiamare il metodo base.

Quindi il tuo codice sarebbe simile a:

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

In questo modo non è necessario capire come la classe base formatta la stringa di output.

Se invece volessi modificare il formato della stringa di output, non faresti alcuna chiamata al metodo di base (dal momento che quel metodo potrebbe cambiare la sua formattazione nelle versioni future, di cui non vuoi essere influenzato ).

  

Quindi la mia comprensione è che creo il mio controllo, derivante dal controllo di base - e posso scrivere il mio metodo FormatTags () - è corretto?

Esatto; quando esegui l'override, fornisci la tua implementazione del metodo di una classe base.

Nel migliore dei casi, accade una delle due cose:

  • Esiste un modo semplice per trasformare l'output del metodo della classe base nel risultato desiderato.

  • La classe base utilizza un modello di strategia o una sua variante, in modo da fornire semplicemente un'implementazione alternativa della parte appropriata della strategia.

Sfortunatamente, non sembra che uno di questi sia il caso qui, quindi potresti doverlo scrivere da zero.

  

Quindi la mia comprensione è che creo   il mio controllo, derivante dalla base   controllo - e posso scrivere il mio   Metodo FormatTags () - è corretto?

Assolutamente corretto.

Se stai scoprendo che devi copiare molto codice in giro, dovresti cercare di ristrutturare il tuo metodo. Inserisci il codice che viene copiato in un altro metodo che non sostituirai, quindi quando esegui l'override di FormatTags, modifica ciò di cui hai bisogno e accedi a quel codice che avresti copiato chiamando l'altro metodo.

Dai un'occhiata ai metodi di estensione . Questi consentono di estendere la capacità di una classe sigillata che non è possibile modificare o estendere, definendo la propria funzione nella propria classe statica. Ecco un esempio che ho appena scritto (potrebbero avere errori di sintassi).

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

Ora, per accedere a questo, posso semplicemente chiamare:

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

string myResult = myString.AppendCrazyText(myCrazyText);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top