首页 > 解决方案 > 正确处理泛型方法中的初始化

问题描述

假设我有一个 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> { ... }

标签: c#oopdesign-patternssoftware-design

解决方案


“IAToB 的实现者现在需要传入一个初始化的 B。因此,与前者相比,后者的接口是否更符合 SOLID 原则”

这里的第一个说法是不正确的。一个out参数保证被调用的方法初始化,并且它不需要预先初始化为任何东西(实际上这样做是多余的,应该避免)。它只是方法完成后调用者可以访问的引用。因此答案是,“不,它并不比第一个例子更可靠。”

文档中

作为输出参数传递的变量不必在传递到方法调用之前进行初始化。但是,被调用的方法需要在方法返回之前分配一个值。

通常使用一个out参数,以便一个方法可以返回多个结果。TryParse是一个典型的例子,它返回一个bool指示成功,并将一个out参数设置为解析的值(如果不成功,则为该类型的默认值)。


此外,无论您如何实现此转换方法,如果您以影响如何B从 an 创建a 的方式更改初始化逻辑A,那么您将不得不在某处更新转换代码。


推荐阅读