2010-07-31 56 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

一些代碼將是必要的。特別說明你認爲阻止你將共同代碼提取爲共享可重用方法。 – 2010-07-31 04:32:57

回答

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); 

或者,如果他們沒有一個共同的特徵,使用委託的「最大公分母」的簽名來調用實際的線性插值功能。

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

否則總會有反射。

+0

好主意!謝謝! – RCIX 2010-07-31 06:09:33