首页 > 解决方案 > 使用泛型方法时如何正确约束到相关的类类型?

问题描述

我有两个基类BaseObjectBaseObjectSettings. 第一个定义对象行为,第二个定义类的状态(对序列化有用)。

如果我想创建具有特定设置的派生 BaseObject 类,那么我可以使用具有泛型类型约束的方法。

public void CreateBaseObjectInstance<T>(BaseObjectSettings baseObjectSettings) where T : BaseObject
{
    var instance = pool.GetInstance<T>();
    instance.Settings = baseObjectSettings;
    scene.Add(instance);
}

我面临的问题是,虽然我可以将泛型类型限制为 BaseClass,但我无法将 BaseClassSettings 限制为相关的派生 BaseClass。这意味着我可以做类似的事情

CreateBaseObjectInstance<Banana>(new AppleSettings());

这似乎有点可怕。

鉴于我目前受限于在将对象添加到场景之前以相同的方法创建和初始化对象,我有哪些选择?

标签: c#genericsmethodsgeneric-type-parameters

解决方案


一种方法是让所有设置类都继承自通用基类。然后通用基类可以继承自BaseObjectSettings. 泛型类型参数指示此设置类适用于哪种对象。

例如,对于您的AppleSettings

class AppleSettings: ObjectSettings<Apple> {
    ...
}

abstract class ObjectSettings<T>: BaseObjectSettings where T: BaseObject {}

现在,您可以CreateBaseObjectInstance改为接受以下实例ObjectSettings<T>

public void CreateBaseObjectInstance<T>(ObjectSettings<T> objectSettings) where T : BaseObject
{
    var instance = pool.GetInstance<T>();
    instance.Settings = objectSettings;
    scene.Add(instance);
}

如果你通过Bananaas T,它会期望ObjectSettings<Banana>,阻止你给它AppleSettings,这是ObjectSettings<Apple>


推荐阅读