圆形的泛型类型参数 [英] circular generic type parameters

查看:124
本文介绍了圆形的泛型类型参数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有2个普通班, BaseComponent 类和 BaseManager 类。

I have 2 generic classes, a BaseComponent Class, and a BaseManager class.

他们都是抽象的,旨在进行混凝土。

They're both abstract and are intended to be made concrete.

public abstract class BaseManager<T> where T : BaseComponent<?>
public abstract class BaseComponent<T> where T : BaseManager<?>



BaseManager 有BaseComponents的列表,其中就是为什么我希望把它通用的,所以 PhysicsManager:BaseManager< PhysicsComponent> 将有 PhysicsComponents 的列表。

BaseManager has a list of BaseComponents, which is why i want to make it generic, so a PhysicsManager : BaseManager<PhysicsComponent> would have a list of PhysicsComponents.

我想(或者说,想我需要) BaseComponent 是通用的,因为我只希望从派生类 BaseComponent 将连接到适当的经理。理想情况下,我不希望有写每个派生的组件构造只是这样我就可以将其添加到具体管理器类过去了。理想我想有一个构造函数抽象 BaseManager 类。

I want (or rather, think i need) BaseComponent to be generic because i only ever want classes derived from BaseComponent to be 'attached' to their appropriate manager. Ideally i don't want to have to write a constructor per derived component just so i can add it to a passed in concrete manager class. Ideally i want to have a constructor that takes the abstract BaseManager class.

我如何管理这种通告?依赖

How can i manage this kind of circular dependency?

推荐答案

这听起来像你可能想有两个泛型类型参数:

It sounds like you might want to have two generic type parameters:

public abstract class BaseManager<TComponent, TManager>
    where TComponent : BaseComponent<TComponent, TManager>
    where TManager : BaseManager<TComponent, TManager>
public abstract class BaseComponent<TComponent, TManager>
    where TComponent : BaseComponent<TComponent, TManager>
    where TManager : BaseManager<TComponent, TManager>



是的,臭 - 但是这是那种我在的 Protocol Buffers的

这样,那么你就必须:

public class PhysicsManager : BaseManager<PhysicsComponent, PhysicsManager>

public class PhysicsComponent : BaseComponent<PhysicsComponent, PhysicsManager>

这篇关于圆形的泛型类型参数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆