Вы находитесь на странице: 1из 4

22.

Обобщения
Папко Владислав 9ПИ801
Вопросы для самопроверки
Вопрос 1
Что такое упаковка (boxing) и распаковка (unboxing)?
Ответ:
Упаковка представляет преобразование объекта значимого типа
(например, типа int) к типу object или к типу реализуемого интерфейса и
сохранение преобразованного объекта в управляемой куче (хипе). Распаковка
(unboxing) представляет преобразование объекта типа object к значимому
типу.
Вопрос 2
Что не так в следующем коде?

1 public class StringGetter<T>


2 {
3     public string GetString<T>(T item) => item.ToString();
4 }
Ответ: Данный код и скомпилируется, но один и тот же параметр T
определен и для класса и для метода. В данном случае можно
переименовать параметр либо у класса, либо у метода:
public class StringGetter<K>
{
public string GetString<T>(T item) => item.ToString();
}
Упражнения
Упражнение 1
Что неправильно в следующем коде? Исправьте его:
1 class Instantiator<T>
2 {
3     public T instance;
4     public Instantiator()
5     {
6         instance = new T();
7     }
8 }
Ответ:
Не можем использовать конструктор для создания объекта типа
T. Если нам нужно создать значение по умолчанию, то для этого
необходимо использовать оператор default:

class Instantiator<T>
{
public T instance;
public Instantiator()
{
instance = default(T);
}
}
Упражнение 2

Напишите обобщенный класс, который может хранить в массиве


объекты любого типа. Кроме того, данный класс должен иметь методы для
добавления данных в массив, удаления из массива, получения элемента из
массива по индексу и метод, возвращающий длину массива.
Для упрощения работы можно пересоздавать массив при каждой
операции добавления и удаления
Ответ:
class Collection<T>
{
T[] data; // массив с данными
public Collection()
{
data = new T[0];
}
// добавление данных
public void Add(T item)
{
T[] newData = new T[data.Length + 1];
for(int i = 0; i < data.Length; i++)
{
newData[i] = data[i];
}
newData[data.Length] = item;
data = newData;
}
// удаление данных - удаляем первое вхождение элемента при его
наличии
public void Remove(T item)
{
// находим индекс элемента
int index = -1;
for(int i = 0; i < data.Length; i++)
{
if (data[i].Equals(item))
{
index = i;
break;
}
}
// удаляем элемент по индексу
if(index > -1)
{
T[] newData = new T[data.Length - 1];
for (int i = 0, j = 0; i < data.Length; i++)
{
if (i == index) continue;
newData[j] = data[i];
j++;
}
data = newData;
}
}
// получение элемента по индексу
public T GetItem(int index)
{
if (index >-1 && index < data.Length)
{
return data[index];
}
else
throw new IndexOutOfRangeException();
}
public int Count()
{
return data.Length;
}
}

Оценить