Ci scusiamo per il titolo vago, ma non ero sicuro di come riassumere questo in una frase. Ho una situazione con un sacco di codice C# ridondante, e sembra davvero un qualche tipo di trucco furbo usando alcune proprietà di ereditarietà o generici che risolvono questo. Tuttavia, non sono un programmatore terribilmente esperto (in particolare con C#) e non riesco a vedere la soluzione.Problemi a liberarsi del codice ridondante via ereditarietà o generici
La situazione, in forma semplificata, è simile a questa. Ho un sacco di classi che ereditano tutte da 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
{
...
}
Il problema si presenta quando è necessario elaborare raccolte di questi oggetti. La mia soluzione prima bozza (quella cattiva) è la seguente:
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();
}
}
... e così via. Il problema è che fondamentalmente tutto il codice nei metodi ProcessX è lo stesso, a parte il tipo di oggetti su cui si sta operando. Sarebbe bello consolidare tutti questi in un unico metodo per ovvi motivi.
Il mio primo pensiero è stato semplicemente creare un metodo Process() generico che prendesse un parametro List<SuperFoo>
come parametro e procedesse da lì. Il problema è che un SuperFoo generico non ha un SomeMethod(), e non può averne uno perché ognuna delle classi figlie 'SomeMethod() ha un tipo di ritorno diverso, quindi avere delle sostituzioni non funziona.
Ho visto il codice in cui viene restituito un 'oggetto' e quindi eseguito il cast nel tipo appropriato. –
Anche se questo risolvesse il problema come l'ho presentato qui, dovrei chiarire ... Preferirei non avere 'SomeMethod()' restituisce un generale 'object', perché viene anche chiamato' SomeMethod() ' molti altri posti oltre a questa parte del codice e che richiederebbero il casting in tutti questi altri posti. Grazie per il suggerimento, però. – jloubert