c# - 正确处理泛型方法中的初始化
问题描述
假设我有一个 A 类型的对象,并且想要将其转换为 B 类型。假设这个接口的多个实现将存在,因为我们将有许多 A 和 B 的子级。所以,我创建了一个如下接口:
interface IAToB {
B Transform<A, B>(A a);
}
我看到的这个接口的问题是我需要在Transform中初始化一个B类型的对象,这意味着如果我改变B的初始化逻辑,我需要适当地改变IAToB的所有实现。因此,请考虑以下事项:
interface IAToB {
void Transform<A, B>(A a, out B b);
}
IAToB 的实现者现在需要传入一个初始化的 B。
那么,与前者相比,后者的接口是否更符合 SOLID 原则?或者我只是在没有实际减少耦合的情况下移动耦合,可以这么说?此外,将泛型也放在接口的定义中是否有意义interface IAToB<A, B> { ... }
?
解决方案
“IAToB 的实现者现在需要传入一个初始化的 B。因此,与前者相比,后者的接口是否更符合 SOLID 原则”
这里的第一个说法是不正确的。一个out
参数保证被调用的方法初始化,并且它不需要预先初始化为任何东西(实际上这样做是多余的,应该避免)。它只是方法完成后调用者可以访问的引用。因此答案是,“不,它并不比第一个例子更可靠。”
从文档中:
作为输出参数传递的变量不必在传递到方法调用之前进行初始化。但是,被调用的方法需要在方法返回之前分配一个值。
通常使用一个out
参数,以便一个方法可以返回多个结果。TryParse
是一个典型的例子,它返回一个bool
指示成功,并将一个out
参数设置为解析的值(如果不成功,则为该类型的默认值)。
此外,无论您如何实现此转换方法,如果您以影响如何B
从 an 创建a 的方式更改初始化逻辑A
,那么您将不得不在某处更新转换代码。
推荐阅读
- ssis - 通过 DTExec 调用 SSIS 包失败 - 通过 VS 很好
- c# - 使用 linq 在对象的属性中将 Json 查询为字符串
- c++ - C/C++ 取消引用错误:在空检查之前取消引用
- sql-server - 在 SQL Server 中查询以删除 XML 中的标记
- java - Java JFrame 按钮组织
- git - 为所有存储库自定义 .git 深度?
- sql - SQL Scalar UDF 返回预期结果,然后返回一致的怪异值
- reactjs - 关于useEffect的cleanUp的一些问题
- javascript - Express.static 不提供登录页面
- python-3.x - 熊猫数据框 concat 返回与第一个数据框相同的数据