在C#中:
一个类可以同时实现多少个接口?
public class MyClass: IInteferface_1, IInterface_2, ... , IInterface_N
{
}
N有限制吗?
不要担心我不想实现或维护这样的对象。我只是想知道是否有限制。
答案 0 :(得分:41)
C#语言对接口数量没有限制。但是有两个实际限制。
首先,正如chibacity指出的那样,在处理大量接口或极深的接口层次结构时,编译器最终会耗尽堆空间或堆栈空间。
即使我们解决了这些问题,仍然会有第二个问题。接口实现在InterfaceImpl表中的元数据中编码。元数据表通常不能超过2 ^ 24个成员,因此程序集中所有类型实现的总接口数必须少于约1600万。
显然,你在实践中永远不会遇到这些限制。别担心。
答案 1 :(得分:15)
您可以实现的接口数量受编译器可以处理的内容的限制。太多的接口导致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());
答案 2 :(得分:8)
如果你问这个问题是为了实际实现很多接口,我会说你有一个严重的设计问题。
据我所知,除了计算机的内存之外没有任何限制。
答案 3 :(得分:1)
考虑它对编译器/运行时实际意味着什么MyClass: IInteferface_1, IInterface_2, ... , IInterface_N
。没有设计时间限制,因为编译器只是确保您的类具有应该实现的每个接口的适当(方法)签名。至于运行时间限制,我不认为内存会产生太大的影响,因为通过它实现的接口(在设计时验证)对类的任何引用都只会确保您的类具有该接口的适当方法签名。如果对象没有实现接口,则该对象将缺少方法签名。
答案 4 :(得分:1)
我刚检查了当前版本的MicrosoftC♯语言规范版本4.0,并且没有提及§1.6.4,§1.9,§10.1.4,§10.1.4.2和§13中的限制。 §B.2.7中的语法也没有语法限制。
我显然没有阅读整个500页,但我不知道该文件中的其他地方可能会提到限制。
注意:这仅适用于MicrosoftC♯,仅适用于4.0版。我没有查看MicrosoftC♯的早期版本,也没有检查ECMA / ISOC♯。此外,它仅适用于C♯,CLI中可能存在限制。
最后但并非最不重要的是,Microsoft VisualC♯和NovellMonoC♯中可能存在特定于实现的限制,以及Microsoft和Mono的CLI实现中的特定于实现的限制(即CLR和Mono VM) )。
然而,问题是关于C♯,不是关于C♯的任何特定实现而不是关于CLI,所以我非常有信心声称一个类可以实现的接口数量是无限的。
答案 5 :(得分:-6)
有一个限制
您被限制为255,因为单个字节被JIT用作相关接口的类型表的索引器。