Из предыдущей темы группа должна быть прочитана только в том случае, если я хочу организовать свой код вокруг struct
+ interface
и у меня не может быть никаких записываемых данных внутри моей группы ввода.
Но не все надежды потеряны, мы все еще можем сделать абстрактный класс вместо интерфейсов с хорошими функциями… начнем с текущего дизайна.
Как обобщить этот JobComponentSystem
, чтобы его можно было повторно использовать позже?
Я сделал 2 абстрактных класса, которые принимают дженерик, чтобы влиять на то, что мы получаем во внедренной структуре внутри. Тогда я мог бы создать новую систему без повторного объявления структуры! Барьер уже объявлен и даже введен, потому что мне всегда приходится полагаться на него, чтобы удалить мой реактивный компонент в конце.
Обратите внимание, что я все еще использую свой interface
из предыдущего. Первая версия предназначена для отправки в задание с [ReadOnly]
, так как вы узнали, что вся группа не может быть записана. Затем я могу делать «забавные вещи» с моим методом расширения для всей группы, который работает только с вещью, помеченной IReactiveInjectGroup
.
Вторая версия «Данные» предназначена для разборки и отправки каждой вещи в работу по одной. Подойдет только get
на data
, как только мы «получим» его из структуры, мы сможем записать его в задании. Но IReactiveDataInjectGroup
не будет иметь особого смысла, поскольку мы не отправляем всю группу, но он здесь, потому что может быть полезно иметь этот интерфейс перед входом в задание.
Пример, когда я его использую:
Теперь я указываю свое требование, используя только <ReactiveComponent, DataComponent>
в начале класса, и я автоматически получаю то, что хочу, не произнося ни слова «структура»!
protected injectedGroup
можно было использовать как целиком, так и в разобранном виде, также protected barrier
готово к .CreateCommandBuffer()
редактированию. Я могу добавить еще [Inject]
сюда, если захочу.
Вы по-прежнему не можете ограничить создание задания структуры и должны вводить его + вбрасывать в него данные вручную (поскольку внутри содержится, скорее всего, не подлежащий повторному использованию Execute, а Execute не может быть унаследован откуда-либо), но это достаточно хорошо, как это может получить. В порядке! (Я думаю, что с реализацией интерфейса по умолчанию на C#8 мы действительно могли бы сделать больше для самого задания в вашем абстрактном классе.)