8 Stimmen

Auf der Suche nach einem Entwurfsmuster, um huuuge if on object Type zu ersetzen

OK, also ich bin auf der Suche nach einem Code, der in etwa wie folgt aussieht:

void DoSomething(object o)
{
    if (o is Sometype1) { 
    //cast o to Sometype and do something to it
    }
    else if (o is Sometype2) {
    //cast o to Sometype2 and do something to it
    }
    ...
    else if (o is SometypeN) {
    //cast o to SometypeN and do something to it
    }
}

Ein Ansatz wäre nun, alle Objekte zu o die als Parameter verwendet werden, implementieren eine Schnittstelle wie

interface ICanHaveSomethingDoneToMe
{
    //expose various properties that the DoSomething method wants to access
}

Das Problem dabei ist jedoch, dass ich nicht möchte, dass alle meine Objekte diese Schnittstelle implementieren - die Logik für die "do something"-Methode gehört nicht wirklich zu ihnen. Welches Muster sollte ich verwenden, um damit umzugehen?

Ich vermute so etwas wie eine Reihe von Implementierungen von

interface IPropertiesForDoingSomethingTo<T>
{
    //expose various properties that the DoSomething method wants to access
}

könnte besser sein. Ich würde eine Implementierung für jeden der Objekttypen haben, für die ich das tun möchte, aber dann habe ich dieses neue Problem. Ich müsste dann eine Methode haben wie

IPropertiesForDoingSomethingTo<T> GetPropsGeneric(T t);

aber muss dafür ein massiver Schalter verwendet werden? Soll ich eine Klasse mit vielen Methoden definieren wie

IPropertiesForDoingSomethingTo<Someobject1> GetProps(Someobject1 t);
...
IPropertiesForDoingSomethingTo<Someobject1> GetProps(SomeobjectN t);

Dies hat gegenüber der generischen Version den Nachteil, dass man zur Laufzeit keine neuen Typen hinzufügen kann. Gibt es etwas schlaues, was man mit einem DI-Container in GetPropsGeneric machen kann, um den Container aufzulösen? Vielen Dank!

0voto

baris.aydinoz Punkte 1854

Ich stimme Steven zu, auch dieses Problem Kontext erinnerte mich doppelt Dispatching Problem, daher Visitor Pattern kann die richtige Lösung sein. Aber es ist offensichtlich, dass in Ihrer Hierarchie einige Schnittstellendefinitionen fehlen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X