สมมติว่าฉันมีสองคลาสที่มีลักษณะเช่นนี้ (บล็อกแรกของรหัสและปัญหาทั่วไปเกี่ยวข้องกับ 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
แม้ว่ารหัสสำหรับลอจิกจะเหมือนกันทุกประการ:
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
ข้อพวกเขาจำเป็นต้องเกี่ยวข้องเช่นการสืบทอดคลาสเดียวกันถ้าฉันต้องการใช้รหัสเดียวกันกับพวกเขาในแง่ที่ฉันอธิบายข้างต้น มันเป็นเรื่องที่น่ารำคาญมากที่มีสองวิธีที่เหมือนกันโดยสิ้นเชิง ฉันไม่ต้องการใช้การสะท้อนเนื่องจากปัญหาด้านประสิทธิภาพ
ใครสามารถแนะนำวิธีการบางอย่างที่สิ่งนี้สามารถเขียนในแบบที่หรูหรามากขึ้น?