2010-07-31 4 views
1

나는 추상적 인 기본 클래스를 공유하는 데이터 클래스를 많이 가지고 있기 때문에 일반적으로 일종의 (일종의) 작업을 할 수 있습니다. 그들은 각각 Lerp라는 정적 메소드를 가지고 있는데, 나는 자주 다른 두 라인과 함께 사용합니다. DRY 때문에이 방법을 리팩토링하고 싶었지만 그렇게 할 방법이없는 것 같습니다. 이 문제를 어떻게 해결할 수 있습니까?제네릭과 정적 메서드를 포함하는 호기심 문제

필요한 경우 코드를 제공 할 수 있습니다.

코드는 기본적으로 이것이다 :

 XmlNode mineDataMin = mineDataMaster.SelectSingleNode("DataMinimum"); 
     XmlNode mineDataMax = mineDataMaster.SelectSingleNode("DataMaximum"); 
     _mineTemplate = MineInfo.Lerp(
      new MineInfo(mineDataMin), 
      new MineInfo(mineDataMax), 
      _strength); 

클래스 MineInfo 몇 가지 클래스 중 하나가 될 수 있습니다

, 모두가 공유하는 일반적으로 그 중 하나를 처리 할 수있는에 사용되는 추상 클래스. Lerp는 문제의 원인이되는 정적 방법입니다.

+2

일부 코드가 필요합니다. 특히 공유 코드를 공유 재사용 가능한 방법으로 추출하는 것을 멈추게한다고 생각하는 것을 보여줍니다. –

답변

2

당신이 이것을 할 수있는 한 가지 방법은 Lerp() 함수에 위임을 사용하는 것입니다. 모두가 같은 서명을 공유한다면 가장 간단 할 것입니다.

예를 들어

,

public static Template CreateTemplate<T>(... , Func<T, T, int, Template> lerp) 
    where T : CommonClass 
{ 
    XmlNode mineDataMin = mineDataMaster.SelectSingleNode("DataMinimum"); 
    XmlNode mineDataMax = mineDataMaster.SelectSingleNode("DataMaximum"); 
    return lerp(new T(mineDataMin), new T(mineDataMax), _strength); 
} 

_template = CreateTemplate(... , MineInfo.Lerp); 

을하거나 공통의 서명이없는 경우, 실제 LERP 함수를 호출하는 서명에 대해 "가장 큰 공통 분모"와 대리자를 사용합니다.

_template = CreateTemplate(... , 
    (min, max, strength) => 
    { 
     return SomeOtherInfoInfo.Lerp(min, max); //doesn't use strength 
    }); 

그렇지 않으면 항상 반영됩니다.

+0

좋은 아이디어! 감사! – RCIX