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

2023-12-07

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

这看起来有点可怕。

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


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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用泛型方法时如何正确约束相关类类型? 的相关文章

  • 为什么这个 Web api 控制器不并发?

    我有一个 Web API 控制器 里面有以下方法 public string Tester Thread Sleep 2000 return OK 当我调用它 10 次 使用 Fiddler 时 我预计所有 10 次调用都会在大约 2 秒后
  • 在 HKCR 中创建新密钥有效,但不起作用

    我有以下代码 它返回 成功 但使用两种不同的工具使用搜索字符串 3BDAAC43 E734 11D5 93AF 00105A990292 搜索注册表不会产生任何结果 RegistryKey RK Registry ClassesRoot C
  • 按扩展名过滤搜索文件返回太多结果

    我正在开发一个 C 控制台应用程序 它必须管理 Windows 操作系统上的文件 我需要获取具有特定扩展名的文件名 列表 我找到了很多解决方案 最建议的是以下一种 HANDLE hFind WIN32 FIND DATA data hFin
  • 如何让“循环”泛型在 Java 中工作?

    我在编译以下涉及一些泛型的代码时遇到错误 public abstract class State
  • 传递 constexpr 对象

    我决定给予新的C 14的定义constexpr旋转并充分利用它 我决定编写一个小的编译时字符串解析器 然而 我正在努力保持我的对象constexpr将其传递给函数时 考虑以下代码 include
  • cpp.react库的C++源代码中奇怪的“->* []”表达式

    这是我在文档中找到的 C 片段cpp react 库 https github com schlangster cpp react implicit parallelism auto in D MakeVar 0 auto op1 in g
  • RestSharp获取序列化输出

    我正在寻找一种方法来访问 AddBody 调用的序列化结果 我正在使用内置的 RestSharp 序列化器 例子 class Foo public string FooField void SendRecord var f new Foo
  • 不同 C++ 文件中的相同类名

    如果两个 C 文件具有相同名称的类的不同定义 那么当它们被编译和链接时 即使没有警告也会抛出一些东西 例如 a cc class Student public std string foo return A void foo a Stude
  • 什么是空终止字符串?

    它与什么不同标准 字符串 http www cplusplus com reference string string 字符串 实际上只是一个数组chars 空终止字符串是指其中包含空字符的字符串 0 标记字符串的结尾 不一定是数组的结尾
  • 在 C# 中检查 PowerShell 执行策略的最佳方法是什么?

    当你跑步时Get ExecutionPolicy在 PowerShell 中 它得到有效的执行政策 https learn microsoft com en us powershell module microsoft powershell
  • 在 VS 中运行时如何查看 C# 控制台程序的输出?

    我刚刚编写了一个名为 helloworld 的聪明程序 它是一个 C NET 4 5 控制台应用程序 在扭曲的嵌套逻辑迷宫深处 使用了 Console WriteLine 当我在命令行运行它时 它会运行并且我会看到输出 我可以执行其他命令并
  • Proguard 正在破坏我的清洁度。 Gson 和泛型

    我有一个从持久性加载信息的函数 我只是以一种非常简单的方式告诉它的类型 该类称为SharedPreferencesHelper kt所以它是一个真正的生活问题解决者 fun
  • 如何递归取消引用指针(C++03)?

    我正在尝试在 C 中递归地取消引用指针 如果传递一个对象 那就是not一个指针 这包括智能指针 我只想返回对象本身 如果可能的话通过引用返回 我有这个代码 template
  • 如果输入被重定向则执行操作

    我想知道如果我的输入被重定向 我应该如何在 C 程序中执行操作 例如 假设我有已编译的程序 prog 并且我将输入 input txt 重定向到它 我这样做 prog lt input txt 我如何在代码中检测到这一点 一般来说 您无法判
  • 比较:接口方法、虚方法、抽象方法

    它们各自的优点和缺点是什么 接口方法 虚拟方法 抽象方法 什么时候应该选择什么 做出这一决定时应牢记哪些要点 虚拟和抽象几乎是一样的 虚方法在基类中有一个实现 可以选择重写 而抽象方法则没有 并且must在子类中被覆盖 否则它们是相同的 在
  • Visual Studio 2015:v120 与 v140?

    仅供参考 Win10 x64 我今天开始尝试 Visual Studio 2015 在弄清楚如何运行 C C 部分后 我尝试加载一个大型个人项目 该项目使用非官方的glsdk http glsdk sourceforge net docs
  • 代码中的.net Access Forms身份验证“超时”值

    我正在向我的应用程序添加注销过期警报 并希望从我的代码访问我的 web config 表单身份验证 超时 值 我有什么办法可以做到这一点吗 我认为您可以从 FormsAuthentication 静态类方法中读取它 这比直接读取 web c
  • 在 System.Type 上使用条件断点时出错

    这是函数 public void Init System Type Type this Type Type BuildFieldAttributes BuildDataColumns FieldAttributes 我在第一行设置了一个断点
  • MySqlConnectionStringBuilder - 使用证书连接

    我正在尝试连接到 Google Cloud Sql 这是一个 MySql 解决方案 我能够使用 MySql Workbench 进行连接 我如何使用 C 连接MySqlConnectionStringBuilder 我找不到提供这三个证书的
  • 如何在 C 中将 char 连接到 char* ?

    我怎样才能前置char c to char myChar 我有c值为 A and myChar值为 LL 我怎样才能前置c to myChar使 ALL 这应该有效 include

随机推荐

  • 计算次太阳点

    我刚刚开始使用PyEphem 我当前的任务是 给定日期和时间 计算地球上的亚太阳点latitude longitude价值观 我会深入研究PyEphem来解决这个问题 但如果有人已经这样做了 我会很感激示例代码 我去寻找与OP相同的答案 许
  • 如何在 pyspark 中启动 SparkSession

    我想更改 Spark 会话的默认内存 执行器和核心设置 Jupyter 中 HDInsight 集群上的 pyspark 笔记本中的第一个代码如下所示 from pyspark sql import SparkSession spark S
  • 将 glassfish javax.persistence 添加到 gradle 项目

    我收到这个错误 梯度构建 ant javac Hello java 2 错误 包 javax persistence 不存在 Hello java 2 导入 javax persistence 我应该添加到 gradle build 中以包
  • 在PowerShell中调用动态变量

    我正在尝试创建一个新变量 该变量将使用具有动态名称的其他变量作为其值 这就是我想做的 我有一个包含两个值的 System Array Years 2015 2016 另一个变量 Transactions有各种交易的清单 我尝试按以下方式使用
  • 黄瓜:自动创建步骤文件?

    当我运行黄瓜时它显示 我应该定义的可能步骤 RSpec 书中的一个示例 1 scenario 1 undefined 4 steps 4 undefined 0m0 001s You can implement step definitio
  • selenium.common.exceptions.SessionNotCreatedException:消息:会话未创建:此版本的 ChromeDriver 仅支持 Chrome 版本 114

    我收到以下错误 selenium common exceptions SessionNotCreatedException 消息 会话未创建 此版本的 ChromeDriver 仅支持 Chrome 版本 114 当前浏览器版本为 116
  • 在 Spring 中使用 setAllowedFields() 方法

    我正在使用 Spring 3 2 0 我已经注册了一些自定义属性编辑器以满足一些基本需求 如下所示 import editors DateTimeEditor import editors StrictNumberFormatEditor
  • 实体框架 -Where 子句

    假设我有一个名为 User 的表 当我使用实体框架获取记录时 我这样做 var db new Context var users db Users 它返回我表中的所有用户 好的 如果我这样做 var fooUsers db Users Wh
  • OpenERP中调用另一个表单的方法返回值

    目前 您可以将OpenERP的返回值设置为以下 以获取要关闭的当前表单 return type ir actions act window close 是否有一个返回值可以打开另一个表单 例如 在 产品 表单中 按钮可以调用销售表单或向导表
  • 增量静态再生中的重新验证过程如何工作?

    我有一个关于增量静态再生的问题 据我所知revalidate值范围内getStaticProps 函数告诉 Next js 应该重建页面的时间 我的问题是 在设定的时间后 每个用户 请求都会发生这种情况 还是从第一个用户 请求点击页面开始集
  • 出现错误:[Errno 95] 在 databricks 中写入 zip 文件时不支持操作 [重复]

    这个问题在这里已经有答案了 在这里 我尝试使用 Databricks 中的以下代码压缩文件并将其写入一个文件夹 挂载点 List all files which need to be compressed import os modelPa
  • 将 @material-ui/core 与 NextJS/React 一起使用时的 FOUC

    我的简单 NextJS 页面如下所示 结果可以在https www schandillia com eslint disable no unused vars import React PureComponent Fragment from
  • 运行谷歌应用引擎时出错:无法识别的参数:admin_console_server

    我正在遵循 Python App Engine 入门 教程 但似乎无法连接到开发服务器 当我尝试运行它时 我不断从日志控制台收到以下错误 2013 08 23 09 46 43 PM Running command u usr bin py
  • 获取窗口开始菜单项/快捷方式文件的“友好”名称

    这很奇怪 一些开始菜单项似乎解析为实际 lnk 文件中未包含的 友好 名称 例如 c ProgramData Microsoft Windows Start Menu Programs Accessories System Tools df
  • 在表单中暂停 GIF

    只是想知道如何暂停 GIF 图像 我正在访问服务器 我希望在发生某些事情时播放 gif 图像 并且如果系统冻结 我希望它暂停 我有一个图片框 上面附有图像 这可能吗 PictureBox 使用 ImageAnimator 类来制作 GIF
  • 如何处理NLP中的两种实体提取方法

    我正在使用两种不同的实体提取方法 https rasa com docs nlu entities 同时在 RASA 框架中构建我的 NLP 模型以构建聊天机器人 机器人应该处理具有自定义实体以及一些一般问题 例如位置或组织 的不同问题 因
  • 如何在Xcode 8中按顺序调用XCTest测试用例函数?

    XCTest 测试函数按字母顺序调用 在 Xcode 8 之前 使用 Xcode 8 我无法假设系统调用测试用例的顺序 有人可以阐明它吗 类内的测试在 Xcode 8 中以随机顺序运行 这鼓励测试独立的 and 可重复的 我假设您想按特定顺
  • TEE 2012 不会自动检出文件

    我有 TFS Server 2012 SP1 Eclipse 3 6 2 Helios 服务版本 2 三通 11 0 0 201211191425 我看到了完整的团队菜单 我可以手动签出和签入文件 但是 如果我刚刚开始编辑文件 它不会自动检
  • 生成字符数组的所有排列

    读了这么多 生成字符串排列 的帖子后 我尝试用Java编写它 1 从第一个字符开始与组合中的其余字符交换 但是当我尝试使用递归实现它时 它只给了我两个长度为 3 的字符串 public static void main String arg
  • 使用泛型方法时如何正确约束相关类类型?

    我有两个基类BaseObject and BaseObjectSettings 第一个定义对象行为 第二个定义类的状态 对于序列化有用 如果我想创建具有特定设置的派生 BaseObject 类 那么我可以使用具有泛型类型约束的方法 publ