Общая функция с использованием абстрактного класса - PullRequest
0 голосов
/ 17 сентября 2018

Я пытаюсь создать статическую функцию, заменяющую экземпляр абстрактного класса другим. (Я упростил код, чтобы сосредоточиться на том, где он не работает):

abstract class AbstractData
{
    public int MaxValue;
    public int[] GivenValues;
}

static class AnalyzeData
{
    static void Analyze<T>(int limitValue, AbstractData abstractData) where T : AbstractData
    {
        T.GivenValues = abstractData.GivenValues; //error : T is a type parameter which is not valid in the given context
        T.MaxValue= abstractData.GivenValues[0]; // same error
        foreach (var data in abstractData.GivenValues)
        {
           if (data<limitValue){
               T.MaxValue = data;
           }
        }
        abstractData = T; //same error
    }
}

Я пытался заменить T на AbstractData в определении функции или привести T, но это не сработало.

Единственное решение, которое я нашел, - это использовать другой экземпляр Abstract Data в качестве параметра (и иметь экземпляры in и out):

static void Analyze<T>(int limitValue, AbstractData abstractDataIn, AbstractData abstractDataOut)

Но тогда я потерял бы преимущество общей части функции.

Знаете ли вы, почему у меня есть эта ошибка, и как я могу ее исправить?

Спасибо!

1 Ответ

0 голосов
/ 17 сентября 2018

T - это Type, а не экземпляр типа. Если вы хотите создать и вернуть новый экземпляр, вы должны написать так:

static T Analyze<T>(int limitValue, AbstractData abstractData) where T : AbstractData, new()
{
    T t = new T();
    t.GivenValues = abstractData.GivenValues;
    t.MaxValue= abstractData.GivenValues[0];
    foreach (var data in abstractData.GivenValues)
    {
       if (data<limitValue){
           t.MaxValue = data;
       }
    }
    return t;
}

Где у вас есть возвращаемое значение типа T.

Другой вариант - передать экземпляр T:

static void Analyze<T>(int limitValue, AbstractData abstractData, T t) where T : AbstractData
{
    t.GivenValues = abstractData.GivenValues;
    t.MaxValue= abstractData.GivenValues[0];
    foreach (var data in abstractData.GivenValues)
    {
       if (data<limitValue){
           t.MaxValue = data;
       }
    }
}

Тогда нет необходимости return вновь создаваемого экземпляра.

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