次のような2つのクラスがあると仮定しましょう(コードの最初のブロックと一般的な問題はC#に関連しています)。
class A
{
public int IntProperty { get; set; }
}
class B
{
public int IntProperty { get; set; }
}
これらのクラスは、いかなる方法でも変更できません(これらは、サードパーティアセンブリの一部です)。したがって、同じインターフェイスを実装したり、IntPropertyを含む同じクラスを継承したりすることはできません。
IntProperty
両方のクラスのプロパティにいくつかのロジックを適用したいのですが、C ++ではテンプレートクラスを使用してそれを非常に簡単に行うことができました。
template <class T>
class LogicToBeApplied
{
public:
void T CreateElement();
};
template <class T>
T LogicToBeApplied<T>::CreateElement()
{
T retVal;
retVal.IntProperty = 50;
return retVal;
}
そして、私はこのようなことをすることができます:
LogicToBeApplied<ClassA> classALogic;
LogicToBeApplied<ClassB> classBLogic;
ClassA classAElement = classALogic.CreateElement();
ClassB classBElement = classBLogic.CreateElement();
そうすれば、ClassAとClassBの両方で機能する単一の汎用ファクトリクラスを作成できます。
ただし、C#ではwhere
、ロジックのコードがまったく同じであっても、2つの異なる句を持つ2つのクラスを記述する必要があります。
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;
}
}
where
句に異なるクラスを含める場合、上記の意味で同じコードを適用する場合は、それらを関連付ける必要があります。つまり、同じクラスを継承する必要があります。まったく同じ2つの方法があるのは非常に迷惑です。また、パフォーマンスの問題があるため、リフレクションを使用したくありません。
誰かがこれをよりエレガントな方法で書くことができるアプローチを提案できますか?