У меня есть класс под названием Block, в котором есть метод Draw. Я хочу создать функцию, которая рисует группу блоков одновременно. Поскольку некоторые группы представляют собой массивы, а некоторые — списки, мне пришлось добавить перегрузку, которая по сути делает то же самое, что и базовая функция, но принимает параметр другого типа. Есть идеи, как улучшить этот код?
public static void DrawAll(Block[] arr) {
foreach(Block b in arr)
b.Draw();
}
public static void DrawAll(List arr) {
foreach(Block b in arr)
b.Draw();
}
Я пытался изучить Generics, но не могу выполнить итерацию по T, поскольку компилятор не знает, что это набор блоков.< /p>
// Doesn't work
public static void DrawAll(T arr) {
foreach(var b in arr)
b.Draw();
}
Использование ключевого слова is и приведение также не работает, потому что, насколько я понимаю, вы не можете сделать два разных приведения в тот же оператор if. Поэтому мне придется разделить приведения, и это только ухудшит внешний вид кода:
// Even dummer than just doing the overload
public static void DrawAll(T arr) {
if (arr is Block[] blocksA)
foreach(Block b in blocksA)
b.Draw();
else if (arr is List blocksL)
foreach(Block b in blocksL)
b.Draw();
else throw new Exception("not a collection of blocks");
}
Подробнее здесь: https://stackoverflow.com/questions/788 ... ad-methods