何时不应实现通用接口?

3

在什么情况下应该使用通用接口,有没有一般规则?

我的例子是一个简单的数据帧接口。有一个“用户数据”成员变量,允许实现附加任何需要与帧一起使用的特定于实现的数据。我不知道是否将其保留为对象类型(并要求他们进行强制转换),还是将接口设置为此单个成员的通用接口,以便编译器会捕获错误的用法。

如果它变为通用接口,则使用的血统也需要是通用的,以便将类型传递到下一级(如果这有意义)。对于这个单一成员似乎需要做很多工作,这就是我的问题所在。

谢谢!

2个回答

3

在做出决策时需要考虑的问题:

  1. 任何对象存储在这个数据成员中是否会导致错误?(例如,您是期望/要求一个字符串,还是一个整数就足够了?)

  2. 您预计会使用多少种不同类型的数据对象?它们是否有共同的接口或基类?

  3. 此类当前是否正在使用,并且更改它是否会破坏使用它的其他类?


不要购买这个。特别是第一个点,因为有限制来限制可以使用的类型。 - Finglas
嘿,Docker们,我不确定我理解你的评论。也许我需要澄清第一点? - Kyle Trauberman

3

在异构集合方面,泛型有些许不足。如果您的数据框对象将被组合成单个集合类型以传递,您可能会发现很难应用泛型。特别是在您提供的示例中,似乎没有一个所有“用户数据”都会继承自的基本类型,除了object。

事实上,在这些类型的问题中,您可能会发现自己定义了一个泛型接口和一个非泛型版本,只是为了可以通过多态地传递类型。

泛型功能强大且非常有用,但在您描述的示例中,我怀疑它们可能会带来更多麻烦。


为什么需要同时创建泛型和非泛型版本?如果你需要一个非泛型版本,难道不可以直接使用带有 object 参数的泛型版本吗,例如 List<object> - Mark Byers
更清晰的代码,我会想象的。许多 .NET 开发人员认为,当 System.Object 被用作泛型类型参数时,这是一种代码异味。 - Aaronaught
@Mark:你通常需要一个非泛型接口的主要原因是为了创建引用该接口的集合。泛型规则阻止你将ISomething<object>存储到IList<ISomething<MyClass>>中,即使MyClass显然是一个对象。为了解决这个问题,你经常需要一个非泛型的ISomething接口,以便能够创建异构集合。 - LBushkin
+1 对于异构集合来说非常重要。这是一个非常好的观点,我没有考虑到。 - redman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接