Sorry für die vagen Titel, aber ich war nicht sicher, wie dies in einem Satz zusammenfassen. Ich habe eine Situation mit viel redundantem C# -Code, und es sieht wirklich so aus, als würde eine Art verrückter Trick, der eine Eigenschaft der Vererbung oder Generika verwendet, dies lösen. Allerdings bin ich kein besonders erfahrener Programmierer (besonders bei C#) und kann die Lösung nicht wirklich sehen.Schwierigkeiten haben, über Vererbung oder Generika von redundantem Code befreit
Die Situation, in vereinfachter Form, sieht wie folgt aus etwas. Ich habe eine Reihe von Klassen, die alle von einem Typ erben.
public class Foo : SuperFoo
{
...
public Foo SomeMethod() { ... }
}
public class Bar : SuperFoo
{
...
public Bar SomeMethod() { ... }
}
public class Baz : SuperFoo
{
...
public Baz SomeMethod() { ... }
}
...
public class SuperFoo
{
...
}
Das Problem tritt auf, wenn Sammlungen dieser Objekte verarbeitet werden müssen. Meine erste Lösung (die schlechte) sieht so aus:
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();
}
}
... und so weiter. Das Problem besteht darin, dass im Prinzip der gesamte Code in den ProcessX-Methoden derselbe ist wie der Typ der Objekte, die bearbeitet werden. Es wäre schön, all dies aus offensichtlichen Gründen in einer Methode zusammenzufassen.
Mein erster Gedanke war, nur eine generische Process() -Methode zu machen, die einen List<SuperFoo>
als Parameter nahm und nur von dort fortfahren. Das Problem ist, dass ein generisches SuperFoo keinen Somemethod hat(), und es kann man nicht haben, weil jeder der Somemethod Kinderklassen() einen anderen Rückgabetyp hat, so überschreibt, die nicht funktioniert.
Ich habe Code gesehen, wo ein 'Objekt' zurückgegeben wird, und dann in den entsprechenden Typ umgewandelt. –
Während dies das Problem lösen würde, wie ich es hier vorgestellt habe, sollte ich klarstellen ... Ich würde es vorziehen, wenn 'SomeMethod()' kein allgemeines 'Objekt' zurückgibt, weil' SomeMethod() 'ebenfalls aufgerufen wird viele andere Orte neben diesem Teil des Codes, und das würde Casting in all diesen anderen Orten erfordern. Danke für den Vorschlag. – jloubert