Mari kita asumsikan saya memiliki dua kelas yang terlihat seperti ini (blok kode pertama dan masalah umum terkait dengan C #):
class A
{
public int IntProperty { get; set; }
}
class B
{
public int IntProperty { get; set; }
}
Kelas-kelas ini tidak dapat diubah dengan cara apa pun (mereka adalah bagian dari majelis pihak ke-3). Oleh karena itu, saya tidak dapat membuat mereka mengimplementasikan antarmuka yang sama, atau mewarisi kelas yang sama yang kemudian akan berisi IntProperty.
Saya ingin menerapkan beberapa logika pada IntProperty
properti kedua kelas, dan di C ++ saya bisa menggunakan kelas template untuk melakukannya dengan mudah:
template <class T>
class LogicToBeApplied
{
public:
void T CreateElement();
};
template <class T>
T LogicToBeApplied<T>::CreateElement()
{
T retVal;
retVal.IntProperty = 50;
return retVal;
}
Dan kemudian saya bisa melakukan sesuatu seperti ini:
LogicToBeApplied<ClassA> classALogic;
LogicToBeApplied<ClassB> classBLogic;
ClassA classAElement = classALogic.CreateElement();
ClassB classBElement = classBLogic.CreateElement();
Dengan begitu saya bisa membuat satu kelas pabrik generik yang dapat digunakan untuk ClassA dan ClassB.
Namun, dalam C #, saya harus menulis dua kelas dengan dua where
klausa yang berbeda walaupun kode untuk logika persis sama:
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;
}
}
Saya tahu bahwa jika saya ingin memiliki kelas yang berbeda dalam where
klausa, mereka harus terkait, yaitu mewarisi kelas yang sama, jika saya ingin menerapkan kode yang sama kepada mereka dalam pengertian yang saya jelaskan di atas. Hanya saja sangat menyebalkan memiliki dua metode yang benar-benar identik. Saya juga tidak ingin menggunakan refleksi karena masalah kinerja.
Adakah yang bisa menyarankan beberapa pendekatan di mana ini dapat ditulis dengan cara yang lebih elegan?