25

在 C# 中:

一个类可以同时实现多少个接口?

public class MyClass: IInteferface_1, IInterface_2, ... , IInterface_N
{
}

N有限制吗?

别担心我不想实现或维护这样的对象。我只是想知道是否有限制。

4

6 回答 6

45

C#语言对接口的数量没有限制。但是有两个实际限制。

首先,正如 chibacity 所指出的,编译器在处理大量接口或极深的接口层次结构时,最终会耗尽堆或堆栈空间。

即使我们解决了这些问题,仍然会有第二个问题。接口实现在 InterfaceImpl 表中的元数据中编码。元数据表的成员通常不超过 2^24 个,因此程序集中所有类型实现的接口总数必须少于 1600 万个。

显然,您在实践中永远不会遇到这些限制。别担心。

于 2010-11-26T16:11:36.203 回答
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());
于 2010-11-26T15:42:07.360 回答
8

如果你问这个问题是为了实际实现很多接口,我会说你有一个严重的设计问题。

据我所知,除了您的计算机内存之外,没有其他限制。

于 2010-11-26T13:18:16.397 回答
1

考虑一下它对编译器/运行时的实际意义MyClass: IInteferface_1, IInterface_2, ... , IInterface_N。没有设计时间限制,因为编译器只是确保您的类对于它应该实现的每个接口都有适当的(方法)签名。至于运行时间限制,我认为内存不会产生太大影响,因为通过它实现的接口(在设计时验证)对您的类的任何引用只会确保您的类具有该接口的适当方法签名。如果对象没有实现接口,则该对象将缺少方法签名。

于 2010-11-26T13:57:35.427 回答
1

我刚刚检查了 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,所以我很有信心声称一个类可以实现的接口数量是无限的。

于 2010-11-26T15:33:14.137 回答
-7

有一个限制

您被限制为 255,因为单个字节被 JIT 用作相关接口的类型表的索引器。

于 2010-11-26T13:32:42.070 回答