Al diseñar aplicaciones, es importante saber cuándo usar una clase abstracta y cuándo usar una interfaz. Aunque las interfaces y las clases abstractas parecen similares en algunos aspectos, existen diferencias clave que determinarán cuál es la mejor opción para lo que intenta lograr. En esta publicación de blog, discutiré esas diferencias y cómo decidir cuándo usar cuál. La respuesta corta: una clase abstracta le permite crear funcionalidades que las subclases pueden implementar o anular. Una interfaz sólo le permite definir la funcionalidad, no implementarla. Y aunque una clase sólo puede extender una clase abstracta, puede aprovechar múltiples interfaces. Explicación de la clase abstracta de C#Una clase abstracta es un tipo especial de clase de la que no se pueden crear instancias. Una clase abstracta está diseñada para ser heredada por subclases que implementan o anulan sus métodos. En otras palabras, las clases abstractas se implementan parcialmente o no se implementan en absoluto. Puede tener funcionalidad en su clase abstracta; los métodos en una clase abstracta pueden ser tanto abstractos como concretos. Una clase abstracta puede tener constructores; ésta es una diferencia importante entre una clase abstracta y una interfaz. Puede aprovechar las clases abstractas para diseñar componentes y especificar algún nivel de funcionalidad común que deben implementar las clases derivadas. Explicación de la interfaz C# Una interfaz es básicamente un contrato: no tiene ninguna implementación. Una interfaz sólo puede contener declaraciones de métodos; no puede contener definiciones de métodos. Tampoco puedes tener ningún dato de miembro en una interfaz. Mientras que una clase abstracta puede contener definiciones de métodos, campos y constructores, una interfaz sólo puede tener declaraciones de eventos, métodos y propiedades. Los métodos declarados en una interfaz deben ser implementados por las clases que implementan la interfaz. Tenga en cuenta que una clase puede implementar más de una interfaz pero extender solo una clase. La clase que implementa la interfaz debe implementar a todos sus miembros. Al igual que una clase abstracta, no se pueden crear instancias de una interfaz. Similitudes clave entre clases abstractas e interfaces en C# Hay cuatro similitudes clave entre interfaces y clases abstractas. Comportamiento sin implementación: el lenguaje de programación C# proporciona interfaces y clases abstractas para definir el comportamiento sin implementación. Puede aprovechar una interfaz o una clase abstracta para definir un contrato que debe ser seguido por tipos que extiendan o implementen esa interfaz o clase abstracta. Por ejemplo, puede definir métodos, propiedades y eventos en una interfaz o una clase abstracta que deben implementarse mediante tipos que la extiendan. Sin embargo, desde C# 8.0 en adelante, una interfaz puede contener implementaciones predeterminadas para sus miembros, es decir, métodos y propiedades. Sin creación de instancias: puede utilizar clases e interfaces abstractas para definir tipos de los que no se pueden crear instancias. En su lugar, debe implementar una interfaz o ampliar una clase abstracta con otros tipos. Compatibilidad con polimorfismo: puede lograr polimorfismo utilizando tanto la interfaz como las clases abstractas. Lo más importante es que puede hacer que una clase derivada extienda una clase base abstracta e implemente múltiples interfaces. Modificadores de acceso: los métodos tanto en interfaces como en clases abstractas pueden incluir modificadores de acceso. Sin embargo, cabe señalar que a partir de C# 7.2, todos los miembros de una interfaz son públicos de forma predeterminada. Diferencias clave entre clases abstractas e interfaces en C# Si bien existen ciertas similitudes entre interfaces y clases abstractas, también existen diferencias sutiles. Implementaciones predeterminadas : Puede tener métodos en una clase abstracta que tengan implementaciones predeterminadas. Sin embargo, las interfaces no admitían implementaciones predeterminadas para sus miembros hasta hace poco. Con C# 8.0, puede tener implementaciones predeterminadas para los miembros de una interfaz, similares a las clases abstractas. Tipos de miembros: en una clase abstracta, puede tener varios tipos de miembros, como campos, constructores, destructores y miembros estáticos. También puedes tener constructores en una clase abstracta, pero no puedes tener constructores en una interfaz. Para definir un destructor en cualquier clase en C#, anteponga el nombre del destructor con un signo de tilde (~). Estado: Además, las clases abstractas pueden tener información de estado, es decir, pueden tener campos. Sin embargo, no puede tener campos de instancia en las interfaces. Es por eso que puedes serializar una clase abstracta pero nunca podrás serializar una interfaz. Porque solo puedes serializar una clase, una estructura, una enumeración o un delegado. Cuando serializa una clase abstracta, es la instancia de la clase derivada que extiende la clase abstracta la que realmente se serializa. Herencia: aunque una clase puede extender solo una única clase abstracta, puede implementar varias interfaces. Al implementar múltiples interfaces, puede simular herencia múltiple aprovechando las interfaces en C#. Ventajas de usar clases abstractas en lugar de interfaces en ciertos escenarios. Las clases abstractas brindan capacidades estructurales, de comportamiento y de diseño que las convierten en una buena opción en ciertos escenarios. Gestión del estado: usted Puede utilizar clases abstractas para mantener la información de estado a la que pueden acceder las clases derivadas. Modificadores de acceso: puede utilizar clases abstractas con modificadores de acceso que proporcionan un control detallado sobre sus miembros. Constructores y destructores: puede tener constructores y destructores en una clase abstracta, lo que le permite inicializar sus miembros y escribir código para la lógica de limpieza. Por lo tanto, puede inicializar los miembros de la clase abstracta cuando se crea una instancia de cualquiera de sus clases derivadas y recuperar recursos de memoria cuando estas instancias se destruyen. Ventajas de usar interfaces en lugar de clases abstractas en ciertos escenarios. También existen ciertas ventajas de usar interfaces en su lugar. de clases abstractas. Múltiples implementaciones: se prefieren las interfaces a las clases abstractas cuando desea establecer contratos en su aplicación sin imponer un linaje directo. Una clase puede implementar varias interfaces, lo que le permite cumplir numerosos contratos simultáneamente. Esto puede ayudarle a crear componentes que aprovechen las preocupaciones transversales de una aplicación. Modularidad: las interfaces fomentan un diseño en el que usted define un contrato que cualquier clase de implementación debe cumplir, promoviendo así una arquitectura modular, extensible y flexible que hace su código es más fácil de probar, ampliar y mantener. Burlarse: puede utilizar interfaces para crear objetos simulados al escribir sus pruebas unitarias. Debido a que puede definir el comportamiento sin implementación en una interfaz, puede usar interfaces para crear pruebas unitarias que no dependan de implementaciones definidas en clases concretas. Flexibilidad de diseño: puede aprovechar las interfaces para crear aplicaciones con diseños en evolución aprovechando la implementación predeterminada característica introducida en C# 8.0. Por lo tanto, puede utilizar interfaces para crear aplicaciones que sean flexibles y evolucionen sin romper las implementaciones existentes. Al programar en una interfaz en lugar de sus implementaciones, puede trabajar con abstracciones en lugar de clases concretas. Esto fomenta un diseño en el que los componentes son intercambiables siempre que se adhieran al mismo contrato definido por la interfaz que implementan. ¿Debo usar una clase abstracta o una interfaz? Las clases abstractas le brindan la flexibilidad de tener ciertos métodos concretos y algunos otros. métodos que las clases derivadas deben implementar. Por el contrario, si usa interfaces, necesitará implementar todos los métodos en la clase que extiende la interfaz. Una clase abstracta es una buena opción si tiene planes de expansión futura, es decir, si es probable una expansión futura en la jerarquía de clases. Si desea brindar soporte para futuras expansiones al usar interfaces, deberá ampliar la interfaz y crear una nueva. Por otra parte, es fácil agregar una nueva interfaz a la jerarquía si es necesario. Sin embargo, si ya tiene una clase abstracta en su jerarquía, no puede agregar otra; es decir, puede agregar una clase abstracta sólo si no hay ninguna disponible. Debe utilizar una interfaz si desea un contrato sobre algún comportamiento o funcionalidad. No debe utilizar una interfaz si necesita escribir el mismo código para los métodos de la interfaz. En este caso, debes usar una clase abstracta, definir el método una vez y reutilizarlo según sea necesario. Utilice interfaces para desacoplar el código de su aplicación de implementaciones específicas de la misma, o para restringir el acceso a miembros de un determinado tipo. Como indica la documentación de interfaces de Microsoft: Al usar interfaces, puede, por ejemplo, incluir comportamiento de múltiples fuentes en una clase . Esa capacidad es importante en C# porque el lenguaje no admite herencia múltiple de clases. Además, debe utilizar una interfaz si desea simular la herencia de estructuras, porque en realidad no pueden heredar de otra estructura o clase. Implementaciones de interfaces implícitas y explícitas Las interfaces se pueden implementar de manera implícita o explícita. Permítanme explicar en qué se diferencian estas dos implementaciones. Considere una interfaz llamada IBusinessLogic.public interface IBusinessLogic{ void Initialize();}La siguiente clase llamada BusinessLogic implementa la interfaz IBusinessLogic.public class BusinessLogic: IBusinessLogic{ public void Initialize() { //Algún código }}Puedes crear una instancia de la clase BusinessLogic explícitamente y luego llame al método Initialize() como se muestra a continuación. IBusinessLogic businessLogic = new BusinessLogic();businessLogic.Initialize();El siguiente fragmento de código ilustra cómo se puede implementar implícitamente la interfaz de IBusinessLogic.public class BusinessLogic: IBusinessLogic{ void IBusinessLogic.Initialize() { }}Ahora puede invocar Inicializar( ) método de la misma manera usando una referencia a la interfaz IBusinessLogic. La diferencia entre los dos enfoques es que cuando implementas la interfaz explícitamente en tu clase, estás obligado a invocar un método de tu interfaz usando una referencia a la interfaz únicamente. Por lo tanto, el siguiente fragmento de código no funcionaría, es decir, no se compilaría. BusinessLogic businessLogic = new BusinessLogic();businessLogic.Initialize();Preguntas frecuentes sobre clases abstractas versus interfaces en C# ¿Cuál es la diferencia fundamental entre una clase abstracta y una interfaz? Aunque las interfaces en C# solo pueden tener propiedades, las clases abstractas en C# pueden tener propiedades y campos. Normalmente, utilizamos clases abstractas para crear una clase base abstracta que otras clases pueden ampliar. Por otro lado, las clases implementan las interfaces para ajustarse a un contrato. Con C# 8.0, una interfaz puede tener miembros estáticos, virtuales, abstractos, sellados, privados y externos. Sin embargo, una interfaz no puede tener constructores ni destructores en ninguna versión del lenguaje de programación C#. ¿Puede una clase heredar de múltiples interfaces o clases abstractas? Una clase en C# puede implementar múltiples interfaces, pero puede heredar de una y solo una clase abstracta. ¿Cuándo debo usar una clase abstracta sobre una interfaz? Deberíamos usar una clase abstracta cuando necesitemos definir información de estado y especificar cómo se deben inicializar los campos. ¿Puede una clase abstracta o una interfaz contener campos? Una clase abstracta puede contener campos, pero no puedes tener campos en una interfaz. Esto explica por qué no se puede serializar una interfaz en C#. ¿Cómo afectan las implementaciones predeterminadas en C# 8.0 la diferencia entre clases abstractas e interfaces? Con la introducción de C# 8.0, las interfaces pueden tener implementaciones predeterminadas para sus miembros. Sin embargo, todavía no pueden tener constructores ni campos. Y a diferencia de los métodos de una clase abstracta, las implementaciones predeterminadas de las interfaces no pueden acceder a campos privados. ¿En qué se diferencian en rendimiento las clases abstractas y las interfaces en C#? La diferencia de rendimiento entre interfaces y clases abstractas depende de la implementación. Puede tener varias definiciones de miembros en una clase abstracta o una interfaz. También puede hacer que su interfaz o clase abstracta sea liviana al tener solo declaraciones de miembros. Sin embargo, debido a que las clases abstractas pueden tener constructores y métodos virtuales, tienden a requerir más memoria y recursos de CPU que las interfaces. En otras palabras, se incurre en una ligera penalización de rendimiento al utilizar clases abstractas. Microsoft recomienda utilizar tipos concretos siempre que sea posible para un mejor rendimiento. Copyright © 2024 IDG Communications, Inc.