Подтвердить что ты не робот

Сколько интерфейсов разрешено реализовать?

В С#:

Сколько интерфейсов, которые класс может реализовать в то же время?

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

Есть ли предел для N?

Не беспокойтесь, я не хочу внедрять или поддерживать такой объект. Мне просто интересно, есть ли предел.

4b9b3361

Ответ 1

Язык С# не накладывает ограничений на количество интерфейсов. Однако существуют два практических ограничения.

Во-первых, как указывает цивильность, у компилятора в конечном итоге заканчивается куча или пространство стека при обработке большого количества интерфейсов или крайне глубоких иерархиях интерфейсов.

Даже если бы мы исправили эти проблемы, все равно осталась бы вторая проблема. Интерфейсная реализация кодируется в метаданных в таблице InterfaceImpl. Таблицы метаданных обычно могут содержать не более 2 ^ 24 членов, поэтому общее количество интерфейсов, реализованных всеми типами в сборке, должно быть меньше примерно 16 миллионов.

Очевидно, вы никогда не столкнетесь с этими ограничениями на практике. Не беспокойтесь об этом.

Ответ 2

Количество интерфейсов, которые вы можете реализовать, ограничено тем, что может обрабатывать компилятор. Слишком много интерфейсов приводит к исключению 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

Если вы задаете этот вопрос с целью фактически реализовать много интерфейсов, я бы сказал, что у вас серьезная проблема с дизайном.

Насколько я знаю, нет никаких ограничений, кроме вашей памяти компьютера.

Ответ 4

Рассмотрим, что на самом деле означает время компиляции/выполнения, чтобы сказать MyClass: IInteferface_1, IInterface_2, ... , IInterface_N. Ограничений по дизайну нет, поскольку компилятор просто гарантирует, что ваш класс имеет соответствующие (методы) подписи для каждого интерфейса, который предполагается реализовать. Что касается ограничения времени выполнения, я не думаю, что память имеет большое влияние, поскольку любая ссылка на ваш класс через интерфейс, который он реализует (как проверено во время разработки), просто обеспечит, чтобы ваш класс имел соответствующую сигнатуру метода для этого интерфейса. Если объект не реализует интерфейс, объекту будет просто недоставать подпись метода.

Ответ 5

Я только что проверил текущую версию Microsoft C♯ Language Specification Version 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, поэтому я уверен, что количество интерфейсов, которые может реализовать класс, неограничен.

Ответ 6

Существует предел

Вы ограничены 255, поскольку один байт используется в качестве индексатора JIT для таблицы типов для соответствующего интерфейса.