代码之家  ›  专栏  ›  技术社区  ›  Liviu Mandras

允许实现多少个接口?

  •  24
  • Liviu Mandras  · 技术社区  · 14 年前

    在C#:

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

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

    对N有限制吗?

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

    6 回复  |  直到 14 年前
        1
  •  42
  •   Eric Lippert    14 年前

    首席执行官# 语言 不限制接口的数量。但有两个实际的限制。

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

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

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

        2
  •  15
  •   Tim Lloyd    14 年前

    您可以实现的接口数量受编译器可以处理的内容的限制。接口太多会导致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());
    
        3
  •  8
  •   Nobody    14 年前

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

    据我所知,除了你电脑的内存,没有别的限制。

        4
  •  1
  •   bitxwise    14 年前

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

        5
  •  1
  •   Jörg W Mittag    14 年前

    我刚刚检查了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/isoc。而且,它只适用于C,CLI中可能有限制。

    最后但并非最不重要的一点是,在Microsoft Visual C和novellmonoc中可能存在特定于实现的限制,在Microsoft和Mono的CLI实现(即CLR和Mono VM)中也可能存在特定于实现的限制。

    但是,问题是关于C,而不是关于C的任何特定实现,也不是关于CLI,所以我很有信心声称一个类可以实现的接口数量是无限的。

        6
  •  -6
  •   Dean Chalk    14 年前

    有个限度

    由于JIT将单个字节用作相关接口的类型表的索引器,因此只能使用255。