c# - 使用泛型方法时如何正确约束相关类类型?

标签 c# generics methods generic-type-parameters

我有两个基类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());

这看起来有点可怕。

鉴于我目前只能在将对象添加到场景之前使用同一方法创建和初始化对象,我有什么选择?

最佳答案

一种方法是让所有设置类继承通用基类。然后,通用基类可以继承自 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);
}

如果您通过BananaT ,它会期望 ObjectSettings<Banana> ,阻止您给予 AppleSettings ,即ObjectSettings<Apple> .

关于c# - 使用泛型方法时如何正确约束相关类类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68044986/

相关文章:

c# - 为什么可以创建 COM 接口(interface)的新实例?

java - 如何从泛型列表转换为 Java 8 中的对象列表?

ios - 具有关联数据的重复任务的泛型 - Swift

android - 数组方法返回数组,只有第一个值?

java - 使用来自不同类的参数访问方法

c# - 在c#中使用openxml和pdfcreator将docx转换为pdf

c# - Razor 表单在页面上显示不需要的文本

c# - 使用 Newtonsoft Json ItemConverterType 的正确方法

c# - 可变长度参数 c#

java - JavaDoc 中@see 的用法?