代码之家  ›  专栏  ›  技术社区  ›  RCIX

涉及泛型和静态方法的奇怪问题

  •  1
  • RCIX  · 技术社区  · 14 年前

    我有许多数据类,它们共享一个抽象的基类,这样我就可以对它们进行一般性的处理(有点)。它们每个都有一个名为lerp的静态方法,我经常将其与其他几行一起使用。因为Dry,我想将其重构为一个方法,但似乎没有办法这样做。我该怎么解决这个问题?

    必要时可以提供代码。

    代码基本上是这样的:

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

    当类mineinfo可以是少数几个类中的一个类时,它们都共享一个抽象类,该抽象类用于一般地处理其中的任何一个类。LERP是一种静态方法,它是故障的根源。

    1 回复  |  直到 14 年前
        1
  •  2
  •   Jeff Mercado    14 年前

    一种方法是使用委派 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
        });
    

    否则总会有反省。