Любопытная проблема с использованием обобщений и статических методов - PullRequest
1 голос
/ 31 июля 2010

У меня есть несколько классов данных, которые совместно используют абстрактный базовый класс, поэтому я могу работать с ними в общем (вроде). У каждого из них есть статический метод, называемый Lerp, который я часто использую вместе с парой других строк. Я хотел преобразовать это в метод из-за СУХОГО, но, похоже, нет никакого способа сделать это. Как мне обойти это?

Может предоставить код при необходимости.

Код в основном такой:

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

где класс MineInfo может быть одним из немногих классов, которые все используют абстрактный класс, который используется для возможности иметь дело с любым из них в общем. Лерп - статический метод, который является источником проблемы.

1 Ответ

2 голосов
/ 31 июля 2010

Один из способов сделать это - использовать делегирование для функции 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
    });

В противном случае всегда есть отражение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...