Написать шаблонный класс для массива
Нужно написать шаблонный класс для массива, у которого параметризированный тип данных. Все бы ничего, но нужно еще создать конструктор, который с заданной длиной либо просто инициализирует массив, либо случайно его генерирует, и на этом моменте я застрял. Вот пока мой код, не знаю как правильно реализовать.
public class MyArray<T>
{
private T[] array;
private int size;
public MyArray(int n, bool choice)
{
size = n;
array = new T[size];
if (choice)
{
Random rnd = new Random();
for (int i = 0; i < size; i++)
{
array[i] = (T) rnd.Next();
}
}
}
}
Помогите на примере чисел (int, long, float, double). Символы, строки и булевые не нужно.
Ответы (1 шт):
Так как наш шаблонный класс знать не должен про то как генерировать тип который ему в параметр пихают потными ручонками, то заюзаем паттерн стратегия (Акция "Удиви препода!". Кстати, чтобы потом не было мучительно стыдно - почитайте на досуге про паттерны в целом и про стратегию в частности, ведь хороший препод обязательно спросит):
public interface IGenerateStrategy<out T>
{
T Get();
}
Для примера стратегии для типа int и float, остальные сочиняйте сами по мере необходимости:
public class IntGeneratorStrategy : IGenerateStrategy<int>
{
private readonly Random _rnd = new Random();
public int Get() => _rnd.Next();
}
public class FloatGeneratorStrategy : IGenerateStrategy<float>
{
private readonly Random _rnd = new Random();
public float Get()
{
var mantissa = _rnd.NextDouble() * 2.0 - 1.0;
var exponent = Math.Pow(2.0, _rnd.Next(-126, 128));
return (float)(mantissa * exponent);
}
}
Наш класс:
public class MyArray<T>
{
public T[] Array { get; }
public MyArray(int n, IGenerateStrategy<T> generateStrategy = null)
{
var size = n;
Array = new T[size];
if (generateStrategy != null)
{
for (var i = 0; i < size; i++)
{
Array[i] = generateStrategy.Get();
}
}
}
}
Если вторым параметром будет передана нужная стратегия - то элементы будут генерится стратегией и все зашибись, если ее нет - массив будет заполнен дефолтными значениями.
var intArray = new MyArray<int>(5); // 0,0,0,0,0
var intArrayRandom = new MyArray<int>(5, new IntGeneratorStrategy()); // 5 рандомных интов
var floatArray = new MyArray<float>(5); //по аналогии
var floatArrayRandom = new MyArray<float>(5, new FloatGeneratorStrategy());