2012-06-19 3 views
3

BaseClass 형식의 매개 변수를 허용하는 3 개의 함수를 작성한 다음 반환 값으로 DerivedClasses를 반환해야합니다.코드 디자인 패턴 적용을 통한 리펙토링

Public DerivedClass1 SimpleTest1(BaseClass baseType) 
{ 
DerivedClass1 derivedClass1 = new DerivedClass1(); 
derivedClass1.item = baseType.item; 
derivedClass1.itemGroup = baseType.itemGroup; 
return derivedClass1; 
} 

Public DerivedClass2 SimpleTest2(BaseClass baseType) 
{ 
DerivedClass2 derivedClass2 = new DerivedClass2(); 
derivedClass2.item = baseType.item; 
derivedClass2.itemGroup = baseType.itemGroup; 
return derivedClass2; 
} 

Public DerivedClass3 SimpleTest3(BaseClass baseType) 
{ 
DerivedClass3 derivedClass3 = new DerivedClass3(); 
derivedClass3.item = baseType.item; 
derivedClass3.itemGroup = baseType.itemGroup; 
return derivedClass3; 
} 

모든 3 가지 방법으로 작성된 코드는 동일합니다. 코드 중복없이 이것을 달성하는 더 좋은 방법이 있습니까? 여기에 적용 할 수있는 특정 디자인 패턴이 있습니까?

답변

4

사용이에 제네릭 당신은 꽤 멋지게 표현할 수 있습니다

public T SimpleTest<T>(BaseClass baseType) where T : BaseClass, new() 
{ 
    T derived = new T(); 
    derived.item = baseType.item; 
    derived.itemGroup = baseType.itemGroup; 
    return derived; 
} 

당신이 기본 생성자를 가지고이 그렇지 않으면이 작동하지 않습니다 하나의 경고가있다. 하나 이상의 인수 (그러나 각각에 대해 동일한 서명)가있는 생성자가있는 경우 dbaseman의 대답과 같이 Reflection을 사용하여 클래스를 동적으로 인스턴스화 할 수 있습니다.

+0

흥미 롭. 새로운 T()와 dbaseman의 Activator.CreateInstance() 사용에 대한 pro, con의 생각? – dreza

+0

@dreza : [this] (http://stackoverflow.com/a/1649108/312124) 대답에 따르면, 아무 것도 없습니다. –

+0

어떤 종류의 유형을 사용할 수 있는지에 관해서는 new()를 사용하는 것이 더 좋다고 생각합니다. –

2

generic functions의 좋은 응용 프로그램처럼 보인다 ...

public T SimpleTest<T>(BaseClass baseType) where T : BaseClass 
{ 
    T derivedClass = Activator.CreateInstance<T>(); 
    derivedClass.item = baseType.item; 
    derivedClass.itemGroup = baseType.itemGroup; 
    return derivedClass 
}