Из предыдущей темы группа должна быть прочитана только в том случае, если я хочу организовать свой код вокруг struct + interface и у меня не может быть никаких записываемых данных внутри моей группы ввода.

Но не все надежды потеряны, мы все еще можем сделать абстрактный класс вместо интерфейсов с хорошими функциями… начнем с текущего дизайна.

Как обобщить этот JobComponentSystem, чтобы его можно было повторно использовать позже?

Я сделал 2 абстрактных класса, которые принимают дженерик, чтобы влиять на то, что мы получаем во внедренной структуре внутри. Тогда я мог бы создать новую систему без повторного объявления структуры! Барьер уже объявлен и даже введен, потому что мне всегда приходится полагаться на него, чтобы удалить мой реактивный компонент в конце.

Обратите внимание, что я все еще использую свой interface из предыдущего. Первая версия предназначена для отправки в задание с [ReadOnly], так как вы узнали, что вся группа не может быть записана. Затем я могу делать «забавные вещи» с моим методом расширения для всей группы, который работает только с вещью, помеченной IReactiveInjectGroup .

Вторая версия «Данные» предназначена для разборки и отправки каждой вещи в работу по одной. Подойдет только get на data, как только мы «получим» его из структуры, мы сможем записать его в задании. Но IReactiveDataInjectGroup не будет иметь особого смысла, поскольку мы не отправляем всю группу, но он здесь, потому что может быть полезно иметь этот интерфейс перед входом в задание.

Пример, когда я его использую:

Теперь я указываю свое требование, используя только <ReactiveComponent, DataComponent> в начале класса, и я автоматически получаю то, что хочу, не произнося ни слова «структура»!

protected injectedGroup можно было использовать как целиком, так и в разобранном виде, также protected barrier готово к .CreateCommandBuffer() редактированию. Я могу добавить еще [Inject] сюда, если захочу.

Вы по-прежнему не можете ограничить создание задания структуры и должны вводить его + вбрасывать в него данные вручную (поскольку внутри содержится, скорее всего, не подлежащий повторному использованию Execute, а Execute не может быть унаследован откуда-либо), но это достаточно хорошо, как это может получить. В порядке! (Я думаю, что с реализацией интерфейса по умолчанию на C#8 мы действительно могли бы сделать больше для самого задания в вашем абстрактном классе.)