Создать собственную коллекцию пользователей
Мне нужно создать универсальную коллекцию универсальных коллекций, которая должна содержать универсальный класс. Я очень старался, но не нашел ответов. Вот как выглядит моя реализованная коллекция: https://github.com/Infatum/PMC-Data-Model/blob/master/WTF/Position.cs Это коллекция позиции универсального класса Point. Мне нужно создать индексированную коллекцию позиций с именем Matrix, индексированную коллекцию Matrix с именем Container и индексированную коллекцию контейнеров с именем Containers. Пожалуйста, помогите мне!
public class Matrix<T> : ICollection<T> where T : Position<T>
{
protected ArrayList matrix;
protected bool isReadOnly;
public Matrix()
{
matrix = new ArrayList();
}
// ...
}
Проблема: тип 'T' нельзя использовать в качестве параметра типа 'T' в универсальном типе или методе 'Position'. Не существует неявного преобразования ссылок из 'T' в 'WTF.Point'
Это на самом деле задача, которая была дана мне: https://docs.google.com/document/d/1ZYXXAjrh0OYNLUuFy0HT6ZuAzISIecE73cgA4QoRDlc/edit
1 ответ
Ваше ограничение типа на T
является рекурсивным - я не думаю, что вы этого хотите. (И компилятор тоже: ограничение накладывает T
быть своего рода Position<T>
, это означает, что Position<T>
на самом деле Position<Position<T>>
- который нарушает ограничение вашего типа на общий аргумент Position
, это ожидает WTF.Point
вместо Position
)
Решение:
public class Matrix<T> : ICollection<Position<T>>
Но позвольте мне уточнить это немного подробнее: в некотором смысле, вы хотите что-то вроде
public class Matrix<T> : ICollection<T> where T : Position<U>
так что больше нет рекурсии. Ты хочешь T
быть "своего рода Position
"Но теперь у нас появилась бы новая проблема: U
(давайте назовем это "тип элемента") откуда? Вы должны использовать это в качестве аргумента универсального типа Matrix
:
public class Matrix<U> : ICollection<T> where T : Position<U>
Теперь ограничение может быть свернуто непосредственно в тип интерфейса, т.е. ICollection<Position<U>>
давая именно то решение, которое я дал выше (по модулю имен).