Elegir entre clases e interfaces
Una interfaz define las firmas para un conjunto de miembros que deben proporcionar los implementadores. Las interfaces no pueden proporcionar los detalles de implementación para los miembros. Por ejemplo, la interfaz ICollection define miembros relacionados con el trabajo con colecciones. Cada clase que implementa la interfaz debe proporcionar los detalles de implementación para estos miembros. Las clases pueden implementar varias interfaces.
Las clases definen tanto las firmas de miembro como los detalles de implementación para cada miembro. Las clases Abstract (MustInherit en Visual Basic) pueden comportarse como interfaces o clases regulares en el sentido de que pueden definir miembros y de que proporcionan detalles de implementación pero no se exige que lo hagan. Si una clase abstracta no proporciona detalles de implementación, se exige a las clases concretas que heredan de la clase abstracta que proporcionen la implementación.
Mientras ambas clases abstractas e interfaces admiten la separación del contrato de la implementación, las interfaces no pueden especificar nuevos miembros en versiones posteriores, mientras que las clases abstractas sí pueden agregar los miembros necesarios que sean necesarios para admitir funcionalidad adicional.
Es conveniente definir clases en lugar de interfaces.
En versiones posteriores de su biblioteca, puede agregar sin ningún riesgo nuevos miembros a las clases; no puede agregar miembros a las interfaces sin estropear el código existente.
Utilice clases abstractas (MustInherit en Visual Basic) en lugar de interfaces para desacoplar el contrato de las implementaciones.
Defina una interfaz si necesita proporcionar una jerarquía polimórfica de los tipos de valor.
Los tipos de valor deben heredar de ValueType y sólo pueden heredar de ValueType, por lo que no pueden utilizar clases para separar el contrato de la implementación. En este caso, debe utilizar una interfaz si sus tipos de valor requieren el comportamiento polimórfico.
Considere la posibilidad de definir interfaces para lograr un efecto similar al de la herencia múltiple.
Si un tipo debe implementar varios contratos, o el contrato es aplicable a una gran variedad de tipos, utilice una interfaz. Por ejemplo, los tipos utilizados en muchos escenarios diferentes implementan IDisposable. Exigir que las clases hereden de una clase base para poder desecharse haría que la jerarquía de clases fuera demasiado inflexible. Las clases como MemoryStream, que deberían heredar de sus clases primarias sus contratos basados en secuencias, no podrían hacerlo y también serían desechables.
Portions Copyright 2005 Microsoft Corporation. Reservados todos los derechos.
Portions Copyright Addison-Wesley Corporation. Reservados todos los derechos.
Para obtener más información sobre las directrices de diseño, consulte “las instrucciones de diseño de Framework: Convenciones, frases realizadas y modelos para libro de bibliotecas reutilizables de .NET” de Krzysztof Cwalina y Brad Abrams, publicados por Addison-Wesley, 2005.
Vea también
Conceptos
Elegir entre clases y estructuras
Otros recursos
Instrucciones de diseño de tipos
Instrucciones de diseño para desarrollar bibliotecas de clases