C# C使用泛型和

C# C使用泛型和,c#,generics,C#,Generics,我正在尝试一个自定义实体系统框架来开发一个游戏。本质上,我试图用它来做的是拥有一个组件,以及可以从中派生出更多类的组件系统类。我真的不确定如何直接解释我要做的是什么,所以我将复制并粘贴我的代码在这里,然后尝试在最后制定一个特定的问题 组成部分 public class Component { public Entity entity; public Component() { } public Component(Entity e) { e.AddCompo

我正在尝试一个自定义实体系统框架来开发一个游戏。本质上,我试图用它来做的是拥有一个组件,以及可以从中派生出更多类的组件系统类。我真的不确定如何直接解释我要做的是什么,所以我将复制并粘贴我的代码在这里,然后尝试在最后制定一个特定的问题

组成部分

public class Component 
{
    public Entity entity;

    public Component() { }

    public Component(Entity e)
    { e.AddComponent(this); }
}
组件系统

public class ComponentSystem<T> where T : Component
{
    protected List<T> components;

    public void AddComponent(T com)
    {
        this.components.Add(com);
    }

    public void RemoveComponent(T com)
    {
        this.components.Remove(com);
    }

    public void Update(double timeDelta = 0.0f)
    {
    }
}
现在有多重要

public Main(string[] args)
{
    TagSystem Tags = new TagSystem();
    GroupSystem Groups = new GroupSystem();

    Entity e = new Entity();
    e.AddComponent(new TagComponent("UniqueID"));
    e.AddComponent(new GroupComponent());

    Tags.AddComponent(e.GetComponent<TagComponent>());
    Groups.AddComponent(e.GetComponent<GroupComponent>());
}
我希望梅因看起来怎么样

public Main(string[] args)
{
    TagSystem Tags = new TagSystem();
    GroupSystem Groups = new GroupSystem();

    Entity e = new Entity();
    e.AddComponent(new TagComponent(Tags, "UniqueID"));
    e.AddComponent(new GroupComponent(Groups));

    // Or this?
    Entity e = new Entity();
    e.AddComponent(new TagComponent<TagSystem>(Tags, "UniqueID"));
    e.AddComponent(new GroupComponent<GroupSystem>(Groups));
}
我想我要做的是让组件在生成时自动添加到组件系统中,但我真的不知道如何实现这一点。我尝试了以下方法,但两种方法都不起作用:

public void AddToSystem<T, U>(T sys) where T : ComponentSystem<U> 
{ sys.AddComponent(this); }
public void AddToSystem<T>(T sys) 
{ sys.AddComponent(this); } // fails because T has no method AddComponent

合理的设计可能是将组件系统转变为工厂

这样,每当查询组件以获取对象的实例时,它都会跟踪它提供的组件实例。您可以使用依赖项注入来初始化组件

有一些开销:

您需要注册工厂生成的对象,以便组件类型不会耦合到组件系统 如果所有组件都将具有相同的功能来实现,那么您需要为组件或基类定义一个接口,以便组件系统知道如何处理它们 您需要一种方法来告诉组件系统删除实例,否则组件系统占用的内存将永远增长
只是一些想法

Hm,这可能是未来可行的解决方案,但我最终做了一些不同的事情。我找到了这个答案,这让我开发了一个静态的全局系统列表,它允许我在任何地方使用ComponentSystem,因为它是基类。