gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 07:29:09 25 4
gpt4 key购买 nike

我有两个基类 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com