在 C# 中:
一个类可以同时实现多少个接口?
public class MyClass: IInteferface_1, IInterface_2, ... , IInterface_N
{
}
N有限制吗?
别担心我不想实现或维护这样的对象。我只是想知道是否有限制。
在 C# 中:
一个类可以同时实现多少个接口?
public class MyClass: IInteferface_1, IInterface_2, ... , IInterface_N
{
}
N有限制吗?
别担心我不想实现或维护这样的对象。我只是想知道是否有限制。
C#语言对接口的数量没有限制。但是有两个实际限制。
首先,正如 chibacity 所指出的,编译器在处理大量接口或极深的接口层次结构时,最终会耗尽堆或堆栈空间。
即使我们解决了这些问题,仍然会有第二个问题。接口实现在 InterfaceImpl 表中的元数据中编码。元数据表的成员通常不超过 2^24 个,因此程序集中所有类型实现的接口总数必须少于 1600 万个。
显然,您在实践中永远不会遇到这些限制。别担心。
您可以实现的接口数量受编译器可以处理的限制。太多接口会导致 C# 编译器中出现 stackoverflow 异常(错误CS1647)。这会让我相信没有固定的限制,但是在某些情况下编译器会简单地轰炸,即数量将取决于编译器处理类时可用的堆栈空间。
该限制也可能取决于编译器版本。以下代码可用于生成测试用例来探测限制。
int iterations = (int)Math.Pow(2, 8) + 1;
Func<int, string> getInterfaceName = i => "I" + i;
StringBuilder sb = new StringBuilder();
sb.AppendLine("using NUnit.Framework;");
sb.AppendLine("[TestFixture]");
sb.AppendLine("public class Test");
sb.AppendLine("{");
sb.AppendLine("[Test]");
sb.AppendLine("public void bling()");
sb.AppendLine("{");
sb.AppendLine("Class1 class1 = new Class1();");
for (int i = 0; i < iterations; i++)
{
sb.AppendLine(getInterfaceName(i) + " int" + i + " = class1;");
sb.AppendLine("int" + i + ".Bling();");
}
sb.AppendLine("}");
for (int i = 0; i < iterations; i++)
{
sb.AppendLine("public interface " + getInterfaceName(i) + " { void Bling(); }");
}
sb.Append("public class Class1 : " + getInterfaceName(0));
for (int i = 1; i < iterations; i++)
{
sb.Append(", " + getInterfaceName(i));
}
sb.Append("{ public void Bling(){} }");
sb.AppendLine("}");
File.WriteAllText(@"C:\tmp.cs", sb.ToString());
如果你问这个问题是为了实际实现很多接口,我会说你有一个严重的设计问题。
据我所知,除了您的计算机内存之外,没有其他限制。
考虑一下它对编译器/运行时的实际意义MyClass: IInteferface_1, IInterface_2, ... , IInterface_N
。没有设计时间限制,因为编译器只是确保您的类对于它应该实现的每个接口都有适当的(方法)签名。至于运行时间限制,我认为内存不会产生太大影响,因为通过它实现的接口(在设计时验证)对您的类的任何引用只会确保您的类具有该接口的适当方法签名。如果对象没有实现接口,则该对象将缺少方法签名。
我刚刚检查了 Microsoft C♯ 语言规范版本 4.0 的当前版本,并且没有提及 §1.6.4、§1.9、§10.1.4、§10.1.4.2 和 §13 中的限制。§B.2.7 中的语法也没有句法限制。
我显然没有阅读完整的 500 页,但我不知道该文档中的其他地方可能会提到限制。
注意:这仅适用于 Microsoft C♯,并且仅适用于 4.0 版。我没有检查 Microsoft C♯ 的早期版本,也没有检查 ECMA/ISO C♯。此外,它仅适用于 C♯,CLI 中可能存在限制。
最后但并非最不重要的一点是,Microsoft Visual C♯ 和 Novell Mono C♯ 中可能存在特定于实现的限制,以及 Microsoft 和 Mono 的 CLI 实现(即 CLR 和 Mono VM)中的特定于实现的限制。
然而,问题是关于 C♯,而不是关于 C♯ 的任何特定实现,也不是关于 CLI,所以我很有信心声称一个类可以实现的接口数量是无限的。
有一个限制
您被限制为 255,因为单个字节被 JIT 用作相关接口的类型表的索引器。