Disculpe el título impreciso, pero no estaba seguro de cómo resumir esto en una frase. Tengo una situación con mucho código C# redundante, y realmente parece que algún tipo de truco astuto usando alguna propiedad de herencia o genéricos resolvería esto. Sin embargo, no soy un programador terriblemente experimentado (particularmente con C#) y simplemente no puedo ver la solución.Tiene problemas para deshacerse del código redundante a través de la herencia o genéricos
La situación, en forma simplificada, se parece a esto. Tengo un montón de clases que todas heredan de un tipo.
public class Foo : SuperFoo
{
...
public Foo SomeMethod() { ... }
}
public class Bar : SuperFoo
{
...
public Bar SomeMethod() { ... }
}
public class Baz : SuperFoo
{
...
public Baz SomeMethod() { ... }
}
...
public class SuperFoo
{
...
}
El problema surge cuando las colecciones de estos objetos deben procesarse. Mi solución de primer borrador (la mala) se ve así:
public void SomeEventHasHappened(...)
{
ProcessFoos();
ProcessBars();
ProcessBazes();
...
}
public void ProcessFoos()
{
...
foreach (var foo in fooList)
{
...
foo.SomeMethod();
}
}
public void ProcessBars()
{
...
foreach (var bar in barList)
{
...
bar.SomeMethod();
}
}
... y así sucesivamente. El problema es que básicamente todo el código en los métodos ProcessX es el mismo, aparte del tipo de los objetos que se están operando. Sería bueno consolidar todos estos en un método por razones obvias.
Mi primer pensamiento fue simplemente hacer un método genérico de Process() que tomó un List<SuperFoo>
como parámetro y continuar desde allí. El problema es que un SuperFoo genérico no tiene un SomeMethod(), y no puede tener uno porque cada una de las clases secundarias 'SomeMethod() tiene un tipo de devolución diferente, por lo que no funciona el reemplazo.
He visto el código donde se devuelve un 'objeto', y luego se lo transfiere al tipo apropiado. –
Si bien eso resolvería el problema como lo he presentado aquí, debería aclarar ... preferiría no tener 'SomeMethod()' devolver un 'objeto' general, porque' SomeMethod() 'también se llama en muchos otros lugares además de esta parte del código, y eso requeriría el lanzamiento en todos esos otros lugares. Gracias por la sugerencia, sin embargo. – jloubert