Una interfaz es una clase 100% abstracta, por lo que podemos usar una interfaz para una programación eficiente. ¿Hay alguna situación en la que una clase abstracta sea mejor que una interfaz?¿Necesita una clase abstracta así como una interfaz?
Respuesta
clases abstractas se utilizan cuando tienen la intención de crear una clase concreta, pero quiere asegurarse de que hay una cierta estado común en todas las subclases o una posible implementación común para algunas operaciones.
Las interfaces no pueden contener ninguna.
La interfaz de la clase abstracta v/s es un tema que genera mucha curiosidad/interés/confusión para cualquier persona nueva en Java y desea profundizar.
This article proporciona una explicación detallada del tema.
El enlace que proporcionó fue muy útil. Dio un uso claro tanto del resumen como de la interfaz. – Warrior
Sí, hay un lugar para las clases abstractas y las interfaces.
Veamos un ejemplo concreto. Veremos cómo hacer un CheckingAccount
y SavingsAccount
desde un resumen AbstractBankAccount
y veremos cómo podemos usar una interfaz para diferenciar los dos tipos de cuentas.
Para empezar, aquí es una clase abstracta AbstractBankAccount
:
abstract class AbstractBankAccount
{
int balance;
public abstract void deposit(int amount);
public abstract void withdraw(int amount);
}
Tenemos el saldo de la cuenta como balance
y dos métodos deposit
withdraw
y que deben ser implementadas por las subclases.
Como podemos ver, una clase abstracta declara la estructura de cómo se deben definir las cuentas bancarias. Como @Uri menciona en su respuesta, hay un estado en esta clase abstracta, que es el campo balance
. Esto no sería posible con una interfaz.
Ahora, vamos a subclase AbstractBankAccount
para hacer una CheckingAccount
class CheckingAccount extends AbstractBankAccount
{
public void deposit(int amount)
{
balance += amount;
}
public void withdraw(int amount)
{
balance -= amount;
}
}
En la presente subclase CheckingAccount
, hemos implementado las dos clases abstractas - nada demasiado interesante aquí.
Ahora, ¿cómo podríamos implementar SavingsAccount
? Es diferente de un CheckingAccount
en que ganará interés. El interés se puede aumentar utilizando el método deposit
, pero, una vez más, no es como si el cliente depositara el interés por sí mismo. Por lo tanto, podría ser más claro si tuviéramos otro medio para agregar dinero en una cuenta, específicamente para el interés, por ejemplo, un método accrueInterest
.
Podríamos aplicar directamente el método de SavingsAccount
, pero podemos tener más tipos de cuentas bancarias que pueden derivarse de interés en el futuro, por lo que es posible que desee hacer una interfaz InterestBearing
que tiene el accrueInterest
método:
interface InterestBearing
{
public void accrueInterest(int amount);
}
por lo tanto, ahora se puede hacer una clase SavingsAccount
que puede ganar el interés implementando la interfaz InterestBearing
:
class SavingsAccount extends AbstractBankAccount implements InterestBearing
{
public void deposit(int amount)
{
balance += amount;
}
public void withdraw(int amount)
{
balance -= amount;
}
public void accrueInterest(int amount)
{
balance += amount;
}
}
ahora bien, si queremos hacer anothe r tipo de cuenta, digamos PremiumSavingsAccount
, podemos hacer una subclase de AbstractBankAccount
e implementar la interfaz InterestBearing
para hacer otra cuenta que devenga intereses.
La interfaz InterestBearing
se puede ver como y agrega una característica común a diferentes clases. No tendría sentido tener una característica para tratar el interés en una cuenta de cheques cuando no genera ningún interés.
De hecho, hay lugares para que tanto las clases abstractas como las interfaces coexistan y trabajen juntas en una situación.
Uno más:
Hay un artículo sobre el mundo Java que describe el uso de la interfaz y abstractas clases juntos:
En general, las interfaces describen la API pública de que el código debe utilizar, mientras que las clases base abstractas se conservan mejor como un detalle de implementación, donde se puede conservar el código o estado común, para reducir la duplicación en cualquier clase de implementación.
Al usar interfaces en su API, es más fácil para las personas (incluido usted) escribir código de prueba en sus clases, ya que puede usar clases de prueba que, por ejemplo, no dependen de recursos externos, o exhibe tipos explícitos de comportamiento malo pero difícil de simular en la vida real.
Así Java proporciona la interfaz de lista, y la clase base abstracta AbstractList de "minimizar el esfuerzo necesario para poner en práctica" la interfaz ...
Hay un par de razones por las que podría preferir una clase abstracta sin aplicación a través de una interfaz:
- Ciertas operaciones imposibles y de instancia pueden ser interceptadas en tiempo de compilación.
- Tiene la opción de agregar métodos concretos en una versión posterior.
- Solía haber un beneficio de rendimiento significativo hace muchos años.
- Desde una perspectiva de seguridad muy poco clara, no puede obtener una clase preexistente para implementar los métodos creando una subclase de la clase preexistente y la clase abstracta.
Pero, por otro lado, la interfaz de la palabra clave Java permite una fuente más limpia.
Gracias amigo. Me dio valiosas ideas sobre mi consulta. – Warrior
- 1. ¿Por qué declarar una interfaz como abstracta?
- 2. ¿Es una interfaz de Java una clase abstracta?
- 3. Generics: heredan de una clase abstracta que implementa una interfaz
- 4. clase abstracta no implementa interfaz
- 5. ¿Implementar clase abstracta como una clase local? pros y contras
- 6. Necesita algo así como una señal terminada de QWidget
- 7. Clase abstracta de Java Implementar una interfaz con genéricos
- 8. ¿Cómo envuelvo una interfaz C++ (clase abstracta) en C++/CLI?
- 9. serialización de una clase abstracta
- 10. C# Interfaz implementada por clase abstracta vacía
- 11. Clase abstracta 100% frente a la interfaz
- 12. Cuándo usar la clase o interfaz abstracta?
- 13. Java clase abstracta implementa la interfaz
- 14. crear objeto de clase abstracta e interfaz
- 15. devolver una clase abstracta desde una función
- 16. ¿Qué (no) declarar al implementar una interfaz con una clase abstracta?
- 17. ¿Se puede usar una clase abstracta como tipo de referencia?
- 18. Unidad probando una clase que hereda de una clase abstracta
- 19. ¿Hay algo así como una clase interna en Java?
- 20. Django: consultar una clase base abstracta
- 21. ¿Cómo se decide entre usar una clase abstracta y una interfaz?
- 22. ¿Cómo implementar una clase abstracta en ruby?
- 23. Método vacío en una clase abstracta
- 24. ¿Hay alguna ventaja en tener una clase abstracta y una interfaz?
- 25. Heredar de una clase o una clase abstracta
- 26. Cómo y cuándo usar una clase abstracta
- 27. ¿Cómo implementar una clase abstracta en F #?
- 28. Clase base abstracta vs. Clase concreta como SuperTipo
- 29. ¿Por qué usar una clase abstracta vacía en lugar de una interfaz?
- 30. ¿Es la misma cosa una interfaz y una clase abstracta con solo métodos abstractos virtuales?
Seguiría definiendo la interfaz, incluso si se define una clase abstracta. Hace que su código sea más amigable con las pruebas y menos acoplado a una implementación en particular. – tvanfosson
Sí, por supuesto, acepto un 100%. En mi código, por lo general factorizo la interfaz a la interfaz (que sonaba tonto), y uso la clase abstracta como base para la implementación y el estado estándar. – Uri
Usted dijo: "y use la clase abstracta como base para la implementación estándar y estado Probablemente quiso decir: " y utilice la clase abstracta como base para la "implementación común" y el estado " – Shaw