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