c# - 使用泛型方法时如何正确约束到相关的类类型?
问题描述
我有两个基类BaseObject
和BaseObjectSettings
. 第一个定义对象行为,第二个定义类的状态(对序列化有用)。
如果我想创建具有特定设置的派生 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);
}
如果你通过Banana
as T
,它会期望ObjectSettings<Banana>
,阻止你给它AppleSettings
,这是ObjectSettings<Apple>
。
推荐阅读
- angularjs - AngularJS 为工厂/服务附加价值
- sql - 如何在sql server中获取本周的每日数据
- artificial-intelligence - 我应该用什么来检测人群中的特定人?
- spring-boot - 基本 SpringBoot App 无法在 STS 中构建
- arduino - Arduino/Attiny85:ISR 和端口操作延迟
- python-3.x - symbolicRegressor 的 Y_train 值
- c# - 在验证循环中递增 errorProvider
- powershell - 从 powershell Get-ChildItem 结果中排除文件
- c# - 从列表列表中的组合框项目中显示列表
- python - 检查类型而不从外部库导入类型