gpt4 book ai didi

c# - 什么时候应该提供接口(interface)的通用和非通用版本?

转载 作者:行者123 更新时间:2023-11-30 14:30:05 25 4
gpt4 key购买 nike

我了解对象的深克隆和浅克隆之间的区别,但根据 Simon 在 this (copy-constructor-versus-clone) 上的回答问题,应提供通用和非通用版本。为什么?

You can define two interfaces, one with a generic parameter to support strongly typed cloning and one without to keep the weakly typed cloning ability for when you are working with collections of different types of cloneable objects:

我的意思是创建不同的接口(interface)已经足够微不足道了,但是在现代 C# 的泛型繁重的范例中,我发现很难想出一个有效的理由来说明您曾经想要使用非通用和弱类型的版本。哎呀,你甚至可以用 T:object 做同样的事情!

我会这样写我的界面:

public interface IShallowCloneable
{
object Clone();
}

public interface IShallowCloneable<T> // Should this derive IShallowCloneable?
{
T Clone();
}

public interface IDeepCloneable
{
object Clone();
}

public interface IDeepCloneable<T> // Should this derive IDeepCloneable?
{
T Clone();
}

我的类(class)会像这样实现它:

public class FooClass : IDeepCloneable<FooClass>
{
// Implementation
}

最佳答案

正如那句话所说,如果您希望能够使用从具有不同类型参数的相同泛型定义生成的泛型类型集合,您确实必须提供一个非泛型接口(interface)。

考虑 IDeepCloneable<Widget> 的列表和 IDeepCloneable<Gadget>实例。你总是可以把它变成 List<object> ,但是除非诉诸运行时类型检查,否则您无法克隆它们。

如果您希望能够以多态方式克隆(或通常以其他方式访问)这些项目,您需要对它们进行类型化,以便它们的静态类型提供可让您完成这项工作的最小公共(public)接口(interface)。在这种情况下,这将使我们的列表成为 List<IDeepCloneable> .

如果您不打算以多态方式使用这些接口(interface),那么使用一个非通用的 IDeepCloneable不提供任何东西。

关于c# - 什么时候应该提供接口(interface)的通用和非通用版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24426364/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com