Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在泛型方法中正确处理初始化_C#_Oop_Design Patterns_Software Design - Fatal编程技术网

C# 在泛型方法中正确处理初始化

C# 在泛型方法中正确处理初始化,c#,oop,design-patterns,software-design,C#,Oop,Design Patterns,Software Design,假设我有一个A类型的对象,并希望将其转换为B类型。假设此接口存在多个实现,因为我们将有A和B的多个子对象。因此,我创建了一个如下的接口: interface IAToB { B Transform<A, B>(A a); } 接口IAToB{ B变换(A); } 我看到的这个接口的问题是,我需要在Transform中初始化类型为B的对象,这意味着如果我更改B的初始化逻辑,我需要适当地更改IAToB的所有实现。因此,考虑以下内容: interface IAToB {

假设我有一个A类型的对象,并希望将其转换为B类型。假设此接口存在多个实现,因为我们将有A和B的多个子对象。因此,我创建了一个如下的接口:

interface IAToB {
    B Transform<A, B>(A a);
}
接口IAToB{
B变换(A);
}
我看到的这个接口的问题是,我需要在Transform中初始化类型为B的对象,这意味着如果我更改B的初始化逻辑,我需要适当地更改IAToB的所有实现。因此,考虑以下内容:

interface IAToB {
    void Transform<A, B>(A a, out B b);
}
接口IAToB{
空洞变换(A,out,B);
}
IAToB的实现者现在需要传入一个初始化的B

那么,与前者相比,后者是否更符合坚实的原则?或者说,我只是移动耦合而没有实际减少它?此外,将泛型也放在接口的定义中,使
接口IAToB{…}
,这有意义吗

“IAToB的实现者现在需要传入一个初始化的B。那么,与前者相比,后者是否更符合可靠的原则?”

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

发件人:

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

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



此外,无论您如何实现此转换方法,如果您以影响如何从
a
创建
B
的方式更改初始化逻辑,然后您必须在某个地方更新转换代码。

IAToB的实现者现在需要传入一个初始化的B。
此语句不正确。它们需要传入一个
out
参数,该参数可以取消初始化。事实上,该参数之前的任何值都将被忽略,并且不相关。哦,对了,这是有意义的。最后,我认为我希望将初始化过程与转换方法分离,因此如果我删除
out
关键字,这将迫使实现处理B的初始化?或者这是一种错误的想法吗?但是如果调用代码需要提供一个初始化的实例,那么这不就是“解决问题”吗?(即,在需要“更改B的初始化逻辑”的情况下,仍然需要更改创建新B的每个代码)。如果您只是想“解耦初始化”,那么您是否考虑过创建一个单独的工厂类/方法来创建新的实例?对,这就是为什么我问哪种方法更适合这种问题的原因。我对实现这种类型的变压器的最佳方法感到困惑。在某种程度上,类型B需要初始化,以便根据类型A中的数据开始将数据放入其中,因此,在哪里放置初始化的最佳位置?接口不应该关心实现细节。你想得太多了。如果需要,您可以为工厂添加一个参数来生成B。然后调用方可以传入该工厂,该接口的实现者就不必在意了。但我认为这不是一个好的选择;这应该由实现来决定。谢谢,这回答了我的问题。那么,我应该如何进行初始化呢?思考这类事情的最佳方式是什么?像其他人评论的那样,工厂有意义吗?现在的问题是,对于类型a和B的子类,我只需要一个无参数构造函数,所以我不确定我是否完全考虑过了。我不太可能需要更改初始化逻辑,但我也不喜欢在需要更改某些内容时引入耦合。B的初始化与您的接口无关。这取决于各个实现。如果你想强制它成为界面的一部分,你可以,但是就像我在问题下的评论中说的,我认为你不应该。谢谢你,艾米。我以前并不认为我将抽象和实现混为一谈,但正如您所提到的,我确实如此,这导致了我的困惑。你以前的评论现在更有意义了。是的,这里没有耦合,因为这只是一个接口。任何破坏性的更改都需要由接口的实现来处理,而不是接口本身。而且,听起来你在担心一些不太可能发生的事情。只要当前的设计是可靠的,我就不会花太多时间开发一个复杂的系统来“证明未来”代码。