Конструкторы и Generic методы... [Решено]

Общие вопросы о Unity3D

Конструкторы и Generic методы... [Решено]

Сообщение 1max1 06 окт 2018, 21:50

Есть класс:
Синтаксис:
Используется csharp
class EcsComponent
{
    public readonly int entityID;

    public EcsComponent() { }

    public EcsComponent(int entityID)
    {
        this.entityID = entityID;
    }
}
 

Есть метод:
Синтаксис:
Используется csharp
static int nextEntityID = 0;

public static T CreateEntity<T>() where T : EcsComponent, new()
{
    var entity = new T(nextEntityID++);

    return entity;
}

Ругается на строку var entity = new T(nextEntityID++); с таким вот сообщением:
Т: При создании экземпляра типа переменной не удается задать аргументы.
Ну и как тогда юзануть конструктор в дженерик классах?
Последний раз редактировалось 1max1 09 окт 2018, 21:31, всего редактировалось 1 раз.
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Конструкторы и Generic методы...

Сообщение lawson 06 окт 2018, 21:54

new()

обозначает что он не принимает параметры.

Никак.

Скрытый текст:
Бубен и еще один.
lawson
UNIверсал
 
Сообщения: 481
Зарегистрирован: 14 сен 2012, 21:20

Re: Конструкторы и Generic методы...

Сообщение 1max1 06 окт 2018, 22:04

Активатор...
Рефлексия...
ФПС на нуле...
Ммм, замечательно.
Ну да ладно, всё равно спасибо.
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Конструкторы и Generic методы...

Сообщение IDoNotExist 08 окт 2018, 08:57

А сделать отдельный сеттер религия не позволяет?
Синтаксис:
Используется csharp
class EcsComponent
{
    public int EntityID { get; private set; }

    public EcsComponent() { }

    internal SetEntityId(int entityID)
    {
        this.EntityID = entityID;
    }
}
 


Синтаксис:
Используется csharp
static int nextEntityID = 0;

public static T CreateEntity<T>() where T : EcsComponent, new()
{
    var entity = new T();
    entity.SetEntityId(nextEntityID++);

    return entity;
}
Аватара пользователя
IDoNotExist
Адепт
 
Сообщения: 1432
Зарегистрирован: 23 мар 2011, 09:18
Skype: iamnoexist

Re: Конструкторы и Generic методы...

Сообщение 1max1 08 окт 2018, 11:12

Я просто не хочу делать отдельный метод для этого, ибо ID должно быть установлен только 1 раз при создании ентити (в CreateEntity и никак иначе) и в дальнейшем из кода менять его нельзя. А так получится будет метод, которым можно будет поменять айдишку, но это всё прихоти, можно обойтись и без этого, просто обидно, что нужно оборачивать код в костыли, я не знаю зачем разработчики так ограничили, можно ведь было сделать что-то типа:
public static T CreateEntity<T>() where T : EcsComponent, new(), new(int);
Чтобы был и обычный конструктор и с аргументами.
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Конструкторы и Generic методы...

Сообщение seaman 08 окт 2018, 12:53

Нечто типа. (писал прямо тут, могу и ошибаться...)
Синтаксис:
Используется csharp
public static T CreateEntity<T>(Func<int, T> act) where T : EcsComponent
{
    return act(nextEntityID++);  
}
...
var newEntity = CreateEntity<EcsComponent>(l => new EcsComponent(l))
 
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Конструкторы и Generic методы...

Сообщение IDoNotExist 08 окт 2018, 13:04

1max1 писал(а):и в дальнейшем из кода менять его нельзя. А так получится будет метод, которым можно будет поменять айдишку

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

1max1 писал(а):я не знаю зачем разработчики так ограничили, можно ведь было сделать что-то типа:
public static T CreateEntity<T>() where T : EcsComponent, new(), new(int);
Чтобы был и обычный конструктор и с аргументами.

Если бы это было сделать так просто, то наверное давно уже сделали бы, а так даже в последнем .NET нет еще такого функционала насколько я знаю.
Аватара пользователя
IDoNotExist
Адепт
 
Сообщения: 1432
Зарегистрирован: 23 мар 2011, 09:18
Skype: iamnoexist

Re: Конструкторы и Generic методы...

Сообщение 1max1 08 окт 2018, 16:04

Нечто типа. (писал прямо тут, могу и ошибаться...)

Такой вариант рабочий спасибо, как-то и не думал про делегаты.
Ну так ты его не меняй, это же твой код

Да там вермишель одна)), нужно всё инкапсулировать от себя самого дабы потом меньше дыр было))
На худой конец запакуй код в .dll, так как метод internal, он не будет доступен извне.

Это в принципе тоже подходит, но перепаковывать длл при каждых изменениях лень.

В общем сделал через вложенный класс, благо они видят прайваты верхнего класса...
Синтаксис:
Используется csharp
static class ECS_World
{
    static int nextEntityID = 0;

    public static T CreateEntity<T>() where T : ECS_Component, new()
    {
        // Какие-то действия...

        return new T();
    }

    public class ECS_Component
    {
        public readonly int entityID;

        public ECS_Component() { entityID = nextEntityID++; }
    }
}
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Конструкторы и Generic методы...

Сообщение jetyb 09 окт 2018, 17:22

Почему бы тут не сделать абстрактный класс с инициализацией в конструкторе?
jetyb
Адепт
 
Сообщения: 1486
Зарегистрирован: 31 окт 2011, 17:21

Re: Конструкторы и Generic методы...

Сообщение 1max1 09 окт 2018, 17:44

Не совсем понял о чем ты, пример можно?
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Конструкторы и Generic методы...

Сообщение Cr0c 09 окт 2018, 18:41

Если это уникальный id и не будет задаваться снаружи - сделай его приватным статиком и внутри конструктора дергай при задании. Так он и снаружи не виден и инкремент внутри конструктора и доступен всем экземплярам.
В самом компоненте, не надо там вкладывать куда-то.
Аватара пользователя
Cr0c
Адепт
 
Сообщения: 3035
Зарегистрирован: 19 июн 2015, 13:50
Skype: cr0c81

Re: Конструкторы и Generic методы...

Сообщение 1max1 09 окт 2018, 18:45

Cr0c писал(а):Если это уникальный id и не будет задаваться снаружи - сделай его приватным статиком и внутри конструктора дергай при задании. Так он и снаружи не виден и инкремент внутри конструктора и доступен всем экземплярам.
В самом компоненте, не надо там вкладывать куда-то.

...
....
.....
:-?
:-?
:-?
Гениально)
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Конструкторы и Generic методы...

Сообщение Cr0c 09 окт 2018, 21:24

Можно ещё и приватный статик лист этого же типа добавить и в конструкторе добавляться в него и в деструкторе удаляться, статик класс для получения массива всех компонентов и их количества. Ну если надо поиск среди них делать.
Аватара пользователя
Cr0c
Адепт
 
Сообщения: 3035
Зарегистрирован: 19 июн 2015, 13:50
Skype: cr0c81

Re: Конструкторы и Generic методы... [Решено]

Сообщение 1max1 09 окт 2018, 21:30

Да, я тоже об этом подумал, наверное так и сделаю, спасибо за ответы.
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51


Вернуться в Общие вопросы

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11