usan una que programacion orientada objetos las interfaz interfaces implementacion herencia ejemplos derivada como clase abstracta c# .net interface interface-implementation

c# - una - implementacion de interfaces en java



¿Cuántas interfaces se permiten implementar? (6)

Acabo de verificar la versión actual de Microsoft C 4.0 Language Specification versión 4.0, y no hay ninguna mención de un límite en §1.6.4, §1.9, §10.1.4, §10.1.4.2 y §13. Tampoco hay un límite sintáctico en la gramática en §B.2.7.

Obviamente, no leí las 500 páginas completas, pero no sé dónde más en ese documento se podría mencionar un límite.

Nota: esto solo se aplica a Microsoft C♯, y solo a la versión 4.0. No revisé las versiones anteriores de Microsoft C♯, ni revisé ECMA / ISO C♯. Además, solo se aplica a C♯, puede haber límites en la CLI.

Y por último, pero no menos importante, puede haber límites específicos de la implementación tanto en Microsoft Visual C♯ como en Novell Mono C♯, así como límites específicos de la implementación en las implementaciones de CLI de Microsoft y Mono (es decir, el CLR y la VM Mono).

Sin embargo, la pregunta era sobre C♯, no sobre una implementación particular de C♯ y no sobre la CLI, así que me siento bastante seguro al afirmar que el número de interfaces que una clase puede implementar no tiene límites.

Cía#:

¿Cuántas interfaces puede implementar una clase al mismo tiempo ?

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

¿Hay un límite para N?

No se preocupe, no quiero implementar ni mantener un objeto de este tipo. Me preguntaba si hay un límite.


Considere lo que significa realmente para el compilador / el tiempo de ejecución decir MyClass: IInteferface_1, IInterface_2, ... , IInterface_N . No hay límite de tiempo de diseño, ya que el compilador simplemente se asegura de que su clase tenga las firmas apropiadas (método) para cada interfaz que se supone que debe implementar. En cuanto al límite del tiempo de ejecución, no creo que la memoria tenga mucho impacto, ya que cualquier referencia a su clase a través de una interfaz que implementa (como se verificó en el momento del diseño) simplemente se asegurará de que su clase tenga la firma de método adecuada para esa interfaz. Si el objeto no implementa la interfaz, el objeto simplemente carecerá de la firma del método.


El lenguaje C # no impone ningún límite en el número de interfaces. Sin embargo, hay dos límites prácticos.

Primero, como señala Chibacity, el compilador eventualmente se quedará sin espacio de pila o pila al procesar grandes cantidades de interfaces, o jerarquías de interfaces extremadamente profundas.

Incluso si resolviéramos esos problemas, todavía habría un segundo problema. La implementación de la interfaz está codificada en metadatos en la tabla InterfaceImpl. Las tablas de metadatos generalmente no pueden tener más de 2 ^ 24 miembros, por lo que el número total de interfaces implementadas por todos los tipos en un ensamblaje debe ser inferior a aproximadamente 16 millones.

Obviamente, nunca se encontrará con estas limitaciones en la práctica. No te preocupes por eso.


El número de interfaces que puede implementar está limitado por lo que el compilador puede manejar. Demasiadas interfaces dan como resultado una excepción de en el compilador de C # (error CS1647 ). Esto me llevaría a creer que no hay un límite fijo, pero que bajo ciertas condiciones el compilador simplemente bombardeará, es decir, el número dependerá de qué espacio de pila esté disponible cuando el compilador esté manejando la clase.

Es probable que el límite también dependa de la versión del compilador. El siguiente código se puede usar para generar un caso de prueba para sondear el límite.

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());


Hay un limite

Está limitado a 255, ya que el JIT utiliza un solo byte como indexador a la tabla de tipos para la interfaz correspondiente.


Si está haciendo esta pregunta para implementar realmente MUCHAS interfaces, yo diría que tiene un grave problema de diseño.

Que yo sepa, no hay otro límite que no sea la memoria de su computadora.