Здравствуйте. Пишу небольшой учебный рейтрейсер, хочу организовать в нем компонентно-ориентированную модель, подобную используемой в unity3d. Столкнулся с проблемой:
Есть класс
Component. Он прост как топор:
public class Component
{
private Component(){}
public Component(SceneObject ownerSceneObject)
{
this.ownerSceneObject = ownerSceneObject;
}
public readonly SceneObject ownerSceneObject;
}
Т.е. имеется конструктор, который вызывается только в одном методе класса
SceneObject, единственное призвание которого - запомнить навсегда, к кому этот экземпляр привязан. И чтобы никак без этого параметра его нельзя было создать - сферические компоненты в вакууме мне не нужны.
И вот тот самый метод в
SceneObject:
public void AddComponent<ComponentType>() where ComponentType:Component, new(SceneObject ownerSceneObject)
{
components.Add(new ComponentType(this));
}
И все бы хорошо, но компилятор не разрешает мне такое сделать - нельзя задать ограничение конструктора с параметрами, только без - просто
new(). В итоге я не могу вызвать конструктор добавляемого компонента, что вываливается в null reference exception (т.к. не был вызван конструктор производного от Component класса).
Как обойти это ограничение?
Иными словами: как можно заставить generic метод вызывать конструктор с параметрами этого самого generic класса (в смысле класса, имеющего тип generic)?