¿Refactorización de métodos de clases derivadas al método de clase base común? (C#)

En mi proyecto tengo algunas funciones en clases derivadas que son iguales excepto por una sección que es diferente en cada una.

Quiero subir el método a la clase base.

Las funciones se ven así:

func(parameters)
{
//COMMON BITS

if      (someVar == "value1")  { htmlFilename = line; }
else if (someVar == "value2") { subVideoLink = line; }
else if (someVar == "value3") { linksH2HeadingWritten = true; }

//COMMON BITS
}

donde las líneas centrales de las diferentes funciones se parecen a las anteriores pero tienen diferentes valores para "someVar" y diferentes variables en "variable = line;" formato.

Esta es la forma generalizada:

if (someVar == "CommandName") { variable = line; }

La idea que tuve fue enviar a la función un Dictionary<string CommandName, ref string>... sin embargo, parece que no puedo hacer un Diccionario con una cadena ref en él...

Luego eliminaría los casos booleanos de la 'variable' reemplazándolos con versiones de cadena con valores de "verdadero" o "falso".

¿Hay una mejor manera de hacer esto?

preguntado el 24 de julio de 09 a las 15:07

3 Respuestas

Un mejor enfoque sería definir un virtual (o abstract) método en la clase base a la que llamas func. Luego, en cada una de sus subclases, puede anular el método con las instrucciones específicas y func utilizará el comportamiento de la subclase.

public class MyBase
{
    protected virtual void DoCommand() { throw new NotImplementedException(); }

    public void Func()
    {
        ...
        DoCommand();
        ...
    }
}

public class MySubClass : MyBase
{
    protected override void DoCommand()
    {
        ...
    }
}

Respondido 24 Jul 09, 20:07

Ahhh... Veo lo que estás diciendo. Gracias, lo intentaré. - Alex Baranosky

En lugar de tirar la base, ¿por qué no simplemente marcarlo como abstracto? - Steven Sudit

Los métodos abstractos requieren una clase base abstracta. Si la clase base necesita ser concreta por algún motivo, esta es una posible implementación predeterminada. Vacío sería otra opción. Elige tu opción. :) - Dalbyk

Debe crear un método reemplazable en la clase base:

abstract func(parameters);

E implementarlo en las clases derivadas:

class CommandN {
...
func(parameters)
{  htmlfilename = line; }
}

class CommandSubVideoLinkX {
...
func(parameters)
{  subVideoLink = line; }
}

Y así sucesivamente.

Respondido 24 Jul 09, 19:07

las clases de comando no son las clases derivadas en las que se encuentran estas funciones... Lo siento, no lo aclaré. - Alex Baranosky

Si entiendo lo que está tratando de hacer correctamente, puede reducir

if (activeCommand.GetType().Name == "CommandName") { variable = line; }

Abajo a:

if (activeCommand is CommandType ) { /*logic, cast if necessary*/ }

Muy útil cuando tiene una función que toma una clase base, pero realiza un caso especial para un tipo derivado. Esto también manejaría casos en los que otro tipo se deriva de CommandType.

Respondido 24 Jul 09, 19:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.