gpt4 book ai didi

c# - 有什么方法可以创建一个不能在其程序集之外实现的公共(public) .NET 接口(interface)吗?

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

为了在 .NET 中保持二进制向后兼容性,您通常不能向公共(public)类和接口(interface)添加新的抽象方法。如果这样做,那么针对扩展/实现您的类/接口(interface)的旧版本程序集构建的代码将在运行时失败,因为它无法完全扩展/实现新版本。但是,对于类,有一个方便的解决方法:

public abstract class Foo {
internal Foo() { }
}

因为 Foo 的构造函数是内部的,所以我的程序集之外的任何人都不能扩展 Foo。因此,我可以向 Foo 添加新的抽象方法而不必担心向后兼容性,因为我知道另一个程序集中的任何类都不能扩展 Foo。

我的问题是,接口(interface)是否有类似的技巧?我能否创建一个公共(public)接口(interface)并以某种方式保证我的程序集之外的任何人都无法创建它的实现?

最佳答案

不,你不能那样做。但是,考虑到接口(interface)的意义在于通过定义契约来定义实现的行为,这是有道理的。

然而,您可以做的是创建一个继承自您的公共(public)接口(interface)内部接口(interface):

public interface IPublicInterface {
/* set-in-stone method definitions here */
}

internal interface IChildInterface : IPublicInterface {
/* add away! */
}

这应该可以防止与其他程序集的任何向后兼容性问题,同时仍然允许您隐藏其他方法。

当然,缺点是您必须记住在需要时将其转换为 IChildInterface,而不是简单地将其用作 IPublicInterface

不过,老实说,如果您真的想定义一些仅限程序集的功能,同时仍要求最终用户为某些方法定义他们自己的实现,那么您最好的选择可能是抽象类。

关于c# - 有什么方法可以创建一个不能在其程序集之外实现的公共(public) .NET 接口(interface)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26872503/

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