Объединение метода в дженерик

234
02 апреля 2018, 20:52

У меня есть несколько похожих методов вида:

void MethodA_N<T>(string s) where T : RightHandSide, new()
    {
        label11.Text = s;
        backgroundWorker1 = null;
        backgroundWorker1 = new BackgroundWorker();
        TimeLayer ts = new TimeShiftN<T>(gp, radioButton6.Checked, radioButton7.Checked, radioButton10.Checked);
        BackgroundWorkerSetup bws = new BackgroundWorkerSetup(ts.TimeScheme, backgroundWorker1);
        ts.AddBWS(bws);
        chart1.Series["Series1"].Points.Clear();
        chart2.Series["Series1"].Points.Clear();
        chart3.Series["Series1"].Points.Clear();
        chart4.Series["Series1"].Points.Clear();
        backgroundWorker1.WorkerReportsProgress = true;
        backgroundWorker1.WorkerSupportsCancellation = true;
        backgroundWorker1.DoWork += bws.Compute;
        backgroundWorker1.RunWorkerCompleted += ts.Complete;
        backgroundWorker1.ProgressChanged += ts.ProgressChanged;
        backgroundWorker1.RunWorkerAsync();
    }

RightHandSide и TimeLayer - абстрактные классы для различных методов сдвига по пространству и времени соответственно. Мне бы хотелось объединить это в один вид с параметрами U, T производным от U, и V, производным от TimeLayer.

Однако у меня возникает проблема с new TimeShiftN - как мне учесть то, что мне нужно подставить в произвольный V от TimeLayer шаблон из T

UPDATE 9:47 Мне бы хотелось вызывать метод с тремя параметрами: MethodA_N<RightHandSide,ConcreteRightHandSide, TimeShiftN>(""), где RightHandSide принимает значения из двух возможных абстрактных классов, ConcreteRightHandSide - наследник RightHandSide и отдельно TimeShiftN. TimeLayer - у меня абстрактный класс, а TimeShiftN - конкретный наследник абстрактного класса. Проблема в том, что TimeShiftN зависит от ConcreteRightHandSide

Answer 1

Насколько я понял Вы хотите обращаться к методу так:

.MethodA_N<RightHandSide,TimeShiftN>("");

Боюсь сделать это так просто невозможно, т.к. метод содержит обращение к конструктору TimeShiftN, которого у других наследников TimeLayer может и не быть:

//неясно как будут создаваться другие наследники TimeLayer
TimeLayer ts = new TimeShiftN<T>(gp, radioButton6.Checked, radioButton7.Checked, radioButton10.Checked);

Можно вместо вызова конструктора передавать в метод функцию для создания TimeLayer:

void MethodA_N<T,U>(string s, Func<GP,bool,bool,bool,U> layerGenerator) 
    where T : RightHandSide, new()
    where U: TimeLayer
{
    ...
    TimeLayer ts = layerGenerator(gp, radioButton6.Checked, radioButton7.Checked, radioButton10.Checked);   

Но, учитывая что <T> в таком методе не используется вообще, а сама функция используется только один раз, я предпочел бы принимать TimeLayer как аргумент и вынести инициализацию за пределы метода:

void MethodA_N(string s, TimeLayer ts) 
{
    ...
    BackgroundWorkerSetup bws = new BackgroundWorkerSetup(ts.TimeScheme, backgroundWorker1);
    ts.AddBWS(bws);
    ...
}

Пример вызова:

TimeLayer ts = new TimeShiftN<RightHandSide>(gp, radioButton6.Checked, radioButton7.Checked, radioButton10.Checked);
obj.MethodA_N("", ts);
READ ALSO
Передача string msg из Thread1 в Thread2 Form TextBox.Text

Передача string msg из Thread1 в Thread2 Form TextBox.Text

Имеется некий поток ThreadTwo где расположен код:

190
js telegram bot

js telegram bot

Помогите разобраться с ошибкой в кодеВ данном коде бот не запускается из-за строки: if (error) throw new Error(error) - она находится в конце кода в функции...

279
Найти все совершенные числа, меньшие n : JavaScript

Найти все совершенные числа, меньшие n : JavaScript

ПомогитеВот сам код, который, к сожалению, не работает:Посмотрите, пожалуйста, в чем ошибка

285
Отправить post-запрос vue (vue-axios)

Отправить post-запрос vue (vue-axios)

ЗдравствуйтеУ меня есть таблица:

260