Nehmen wir an, ich habe zwei Klassen, die so aussehen (der erste Codeblock und das allgemeine Problem beziehen sich auf C #):
class A
{
public int IntProperty { get; set; }
}
class B
{
public int IntProperty { get; set; }
}
Diese Klassen können in keiner Weise geändert werden (sie sind Teil einer Assembly eines Drittanbieters). Daher kann ich sie nicht dazu bringen, dieselbe Schnittstelle zu implementieren oder dieselbe Klasse zu erben, die dann IntProperty enthalten würde.
Ich möchte einige Logik auf die IntProperty
Eigenschaft beider Klassen anwenden , und in C ++ könnte ich eine Template-Klasse verwenden, um dies ganz einfach zu tun:
template <class T>
class LogicToBeApplied
{
public:
void T CreateElement();
};
template <class T>
T LogicToBeApplied<T>::CreateElement()
{
T retVal;
retVal.IntProperty = 50;
return retVal;
}
Und dann könnte ich so etwas machen:
LogicToBeApplied<ClassA> classALogic;
LogicToBeApplied<ClassB> classBLogic;
ClassA classAElement = classALogic.CreateElement();
ClassB classBElement = classBLogic.CreateElement();
Auf diese Weise konnte ich eine einzelne generische Factory-Klasse erstellen, die sowohl für ClassA als auch für ClassB funktionieren würde.
In C # muss ich jedoch zwei Klassen mit zwei verschiedenen where
Klauseln schreiben , obwohl der Code für die Logik genau gleich ist:
public class LogicAToBeApplied<T> where T : ClassA, new()
{
public T CreateElement()
{
T retVal = new T();
retVal.IntProperty = 50;
return retVal;
}
}
public class LogicBToBeApplied<T> where T : ClassB, new()
{
public T CreateElement()
{
T retVal = new T();
retVal.IntProperty = 50;
return retVal;
}
}
Ich weiß, dass, wenn ich verschiedene Klassen in der where
Klausel haben möchte , sie verwandt sein müssen, dh dieselbe Klasse erben, wenn ich denselben Code in dem oben beschriebenen Sinne auf sie anwenden möchte. Es ist nur sehr ärgerlich, zwei völlig identische Methoden zu haben. Wegen der Leistungsprobleme möchte ich auch keine Reflexion verwenden.
Kann jemand einen Ansatz vorschlagen, der eleganter formuliert werden kann?