다음과 같은 두 개의 클래스가 있다고 가정합니다 (첫 번째 코드 블록과 일반적인 문제는 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
절 위에서 설명한 의미에서 동일한 코드를 적용하려면 관련 클래스, 즉 동일한 클래스를 상속해야합니다. 두 가지 완전히 동일한 방법을 사용하는 것은 매우 성가신 일입니다. 또한 성능 문제로 인해 리플렉션을 사용하고 싶지 않습니다.
누군가가 이것을보다 우아한 방식으로 작성할 수있는 접근법을 제안 할 수 있습니까?