Pregunta

Hice una pregunta sobre interfaces anteriormente y obtuve algunas respuestas excelentes. Estoy realmente emocionado de comenzar a desarrollar código realmente flexible.

Ahora tengo una pregunta sobre cómo anular un método virtual.

Actualmente estoy trabajando con Community Server SDK. Uno de los controles es una miga de pan 'etiquetada'. Por lo tanto, enumerará las 'etiquetas' en el objeto relevante.

<CSBlog:TagBreadCrumb />

Estoy usando etiquetas para permitir que los administradores apunten a puntos específicos para que el contenido aparezca en un diseño, sin embargo, esas etiquetas no son relevantes para el usuario final. Por ejemplo, la etiqueta 'Home_Main' se usa para apuntar al panel principal en la página de inicio, pero no quiero que el usuario vea eso.

Como tengo el SDK para Community Server, encontré el control que representa la 'lista de etiquetas' e hice modificaciones que hacen lo que quiero; sin embargo, entiendo que no es bueno modificar el núcleo por muchas razones.

Entonces, lo que me gustaría hacer es crear mi propio control, que es esencialmente casi 100% idéntico al control base, pero anular un método.

Aquí está el método:

 public virtual string FormatTags(string[] tagList)

Dentro de hay un código para formatear las etiquetas, y me gustaría escribir mi propio código que haga todo lo mismo, excepto que verifique un archivo de configuración para 'etiquetas' para excluir.

Entonces, entiendo que creo mi control, derivado del control base, y puedo escribir mi propio método FormatTags (), ¿es correcto?

Solo necesito cambiar un aspecto, pero ¿significa esto que tengo que copiar el código original para ese método de la clase base y cambiar lo que necesito allí? Simplemente no se siente bien copiar el código desde un punto, pero no conozco otra forma de extender el método sin cambiar el código en la clase base.

Gracias por cualquier sugerencia.

¿Fue útil?

Solución

Todavía puede ejecutar el método derivado y operar en sus resultados:

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

Otros consejos

En su caso (donde desea evitar que ciertas etiquetas se impriman en las migas de pan), debe eliminar todas las etiquetas especiales antes de llamar al método base.

Entonces su código se vería así:

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

De esta manera, no necesita comprender cómo la clase base formatea la cadena de salida.

Si, en cambio, quisieras modificar el formato de la cadena de salida, no harías ninguna llamada al método base (dado que ese método podría estar cambiando su formato en futuras versiones, por lo que no quieres que te afecte ).

  

Entonces, entiendo que creo mi control, derivado del control base, y puedo escribir mi propio método FormatTags (), ¿es correcto?

Eso es correcto; cuando anula, proporciona su propia implementación del método de una clase base.

En el mejor de los casos, sucede una de dos cosas:

  • Hay una manera fácil de transformar la salida del método de la clase base en el resultado deseado.

  • La clase base está utilizando un patrón de Estrategia o una variante del mismo, de modo que simplemente proporcione una implementación alternativa de la parte apropiada de la Estrategia.

Desafortunadamente, no parece que ninguno de esos sea el caso aquí, por lo que puede que tenga que escribirlo desde cero.

  

Entonces, entiendo que creo   mi control, derivado de la base   control - y puedo escribir el mío   Método FormatTags (): ¿es correcto?

Absolutamente correcto.

Si descubre que necesita copiar mucho código, debería considerar la reestructuración de su método. Coloque el código que se está copiando en otro método que no anulará, y luego, cuando anule FormatTags, cambie lo que necesita y simplemente acceda al código que habría copiado llamando al otro método.

Eche un vistazo a métodos de extensión . Estos le permiten ampliar la capacidad de una clase sellada que no puede editar o ampliar, definiendo su función en su propia clase estática. Aquí hay un ejemplo que acabo de escribir (puede tener errores de sintaxis).

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

Ahora, para acceder a esto, simplemente puedo llamar:

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

string myResult = myString.AppendCrazyText(myCrazyText);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top