Giả sử tôi có hai lớp trông như thế này (khối mã đầu tiên và vấn đề chung có liên quan đến C #):
class A
{
public int IntProperty { get; set; }
}
class B
{
public int IntProperty { get; set; }
}
Các lớp này không thể được thay đổi theo bất kỳ cách nào (chúng là một phần của hội đồng bên thứ 3). Do đó, tôi không thể làm cho chúng thực hiện cùng một giao diện hoặc kế thừa cùng một lớp mà sau đó sẽ chứa IntProperty.
Tôi muốn áp dụng một số logic trên thuộc IntProperty
tính của cả hai lớp và trong C ++, tôi có thể sử dụng một lớp mẫu để thực hiện điều đó khá dễ dàng:
template <class T>
class LogicToBeApplied
{
public:
void T CreateElement();
};
template <class T>
T LogicToBeApplied<T>::CreateElement()
{
T retVal;
retVal.IntProperty = 50;
return retVal;
}
Và sau đó tôi có thể làm một cái gì đó như thế này:
LogicToBeApplied<ClassA> classALogic;
LogicToBeApplied<ClassB> classBLogic;
ClassA classAElement = classALogic.CreateElement();
ClassB classBElement = classBLogic.CreateElement();
Bằng cách đó tôi có thể tạo một lớp nhà máy chung duy nhất hoạt động cho cả ClassA và ClassB.
Tuy nhiên, trong C #, tôi phải viết hai lớp với hai where
mệnh đề khác nhau mặc dù mã cho logic hoàn toàn giống nhau:
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;
}
}
Tôi biết rằng nếu tôi muốn có các lớp khác nhau trong where
mệnh đề, chúng cần phải liên quan, nghĩa là kế thừa cùng một lớp, nếu tôi muốn áp dụng cùng một mã cho chúng theo nghĩa mà tôi đã mô tả ở trên. Chỉ là rất khó chịu khi có hai phương pháp hoàn toàn giống nhau. Tôi cũng không muốn sử dụng sự phản chiếu vì các vấn đề hiệu suất.
Ai đó có thể đề xuất một số cách tiếp cận trong đó điều này có thể được viết theo một cách thanh lịch hơn?