У меня есть несколько похожих методов вида:
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
Насколько я понял Вы хотите обращаться к методу так:
.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);
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости