Tengo 2 clases genéricas, una clase BaseComponent
y una clase BaseManager
.parámetros de tipo genérico circular
Ambos son abstractos y están destinados a ser hechos de hormigón.
public abstract class BaseManager<T> where T : BaseComponent<?>
public abstract class BaseComponent<T> where T : BaseManager<?>
BaseManager
tiene una lista de BaseComponents, por lo que quiero que sea genérico, por lo que un PhysicsManager : BaseManager<PhysicsComponent>
tendría una lista de PhysicsComponents
.
Quiero (o más bien, creo que necesito) BaseComponent
ser genérico porque solo quiero que las clases derivadas de BaseComponent
sean 'adjuntas' a su administrador apropiado. Idealmente, no quiero tener que escribir un constructor por componente derivado solo para poder agregarlo a una clase de administrador concreta aprobada. Idealmente quiero tener un constructor que tome la clase abstracta BaseManager
.
¿Cómo puedo gestionar este tipo de dependencia circular?
Consideraría seriamente rediseñar para evitar la dependencia circular. Por ejemplo, make 'BaseComponent' no genérico. Haz que dependa de un 'IManager'. Ponga el elenco de 'BaseComponent' a' TComponent' en 'BaseManager' –
Estoy de acuerdo que es un poco apestoso como Jon señala, pero no lo entiendo del todo. Si 'BaseComponent' dependía de un' IManager', ¿cómo me aseguraría de que todas las clases derivadas de 'BaseComponent' tuvieran un constructor que aceptara la implementación correcta de' IManager' para poder agregarlo a la lista del Manager? Si tienes tiempo, apreciaría una explicación en una respuesta. –