Страница 1 из 1

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

СообщениеДобавлено: 06 окт 2018, 21:50
1max1
Есть класс:
Синтаксис:
Используется 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++); с таким вот сообщением:
Т: При создании экземпляра типа переменной не удается задать аргументы.
Ну и как тогда юзануть конструктор в дженерик классах?

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

СообщениеДобавлено: 06 окт 2018, 21:54
lawson
new()

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

Никак.

Скрытый текст:
Бубен и еще один.

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

СообщениеДобавлено: 06 окт 2018, 22:04
1max1
Активатор...
Рефлексия...
ФПС на нуле...
Ммм, замечательно.
Ну да ладно, всё равно спасибо.

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

СообщениеДобавлено: 08 окт 2018, 08:57
IDoNotExist
А сделать отдельный сеттер религия не позволяет?
Синтаксис:
Используется 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;
}

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

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

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

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

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

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

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

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

Если бы это было сделать так просто, то наверное давно уже сделали бы, а так даже в последнем .NET нет еще такого функционала насколько я знаю.

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

СообщениеДобавлено: 08 окт 2018, 16:04
1max1
Нечто типа. (писал прямо тут, могу и ошибаться...)

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

Да там вермишель одна)), нужно всё инкапсулировать от себя самого дабы потом меньше дыр было))
На худой конец запакуй код в .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++; }
    }
}

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

СообщениеДобавлено: 09 окт 2018, 17:22
jetyb
Почему бы тут не сделать абстрактный класс с инициализацией в конструкторе?

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

СообщениеДобавлено: 09 окт 2018, 17:44
1max1
Не совсем понял о чем ты, пример можно?

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

СообщениеДобавлено: 09 окт 2018, 18:41
Cr0c
Если это уникальный id и не будет задаваться снаружи - сделай его приватным статиком и внутри конструктора дергай при задании. Так он и снаружи не виден и инкремент внутри конструктора и доступен всем экземплярам.
В самом компоненте, не надо там вкладывать куда-то.

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

СообщениеДобавлено: 09 окт 2018, 18:45
1max1
Cr0c писал(а):Если это уникальный id и не будет задаваться снаружи - сделай его приватным статиком и внутри конструктора дергай при задании. Так он и снаружи не виден и инкремент внутри конструктора и доступен всем экземплярам.
В самом компоненте, не надо там вкладывать куда-то.

...
....
.....
:-?
:-?
:-?
Гениально)

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

СообщениеДобавлено: 09 окт 2018, 21:24
Cr0c
Можно ещё и приватный статик лист этого же типа добавить и в конструкторе добавляться в него и в деструкторе удаляться, статик класс для получения массива всех компонентов и их количества. Ну если надо поиск среди них делать.

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

СообщениеДобавлено: 09 окт 2018, 21:30
1max1
Да, я тоже об этом подумал, наверное так и сделаю, спасибо за ответы.