2011-04-29 26 views
16

La clase abstracta tiene funciones tanto concretas como abstractas. La interfaz solo tiene funciones abstractas.¿Cuál es la ventaja de la interfaz sobre las clases abstractas?

Reemplazo posible en ambos. ¿Es

¿Cuál es la ventaja en tiempo real de una sobre la otra?

+3

Elija el idioma * uno *. Las respuestas correspondientes * podrían * ser muy diferentes. –

+1

@Oli - entonces, ¿debo publicar una nueva pregunta? ¿Cómo OOP diferente en diferentes idiomas como java, php, .net :-) – zod

+0

No, porque esa pregunta sería demasiado amplia. Las preguntas sobre SO deben ser * específicas *. –

Respuesta

32

Las interfaces son para cuando quieres decir "No me importa cómo lo haces, pero esto es lo que debes hacer".

Las clases abstractas son para cuando quiere decir "Sé lo que debe hacer, y sé cómo debe hacerlo en algunos/muchos de los casos".

Las clases abstractas tienen algunos inconvenientes graves. Por ejemplo:

class House { 

} 

class Boat { 

} 

class HouseBoat extends /* Uh oh!! */ { 
    // don't get me started on Farmer's Insurance "Autoboathome" which is also a helicopter 
} 

Uno puede pasar por medio de una interfaz:

interface Liveable { 

} 

interface Floatable { 

} 

class HouseBoat implements Liveable, Floatable { 

} 

Ahora, las clases abstractas son también muy útiles. Por ejemplo, considere la clase AbstractCollection. Define el comportamiento predeterminado para métodos muy comunes para todas las colecciones, como isEmpty() y contains(Object). Puede anular estos comportamientos si lo desea, pero ... ¿es muy probable que cambie el comportamiento para determinar si una colección está vacía? Por lo general, será size == 0.

Y como no cambiará a menudo, ¿realmente vale la pena el tiempo del desarrollador para implementar ese método cada ... único ... tiempo ... para cada método en esa categoría "resuelta"? Por no mencionar cuando necesite hacer un cambio, tendrá duplicación de código y errores perdidos si tuviera que volver a implementarlo en todas partes.

+2

También es útil en proyectos medianos y grandes para acordar las interfaces que admitirán ciertos módulos.Necesita saber qué puede esperar de los otros módulos y los otros módulos tienen una idea de lo que pueden esperar de su módulo. – user183037

+0

De acuerdo. Se presta para cambiar la implementación más fácilmente. – corsiKa

+4

+1 lol en "// no me inicie en Farmer's Insurance" Autoboathome "que también es un helicóptero" – mellamokb

15

Las interfaces son útiles porque Java no tiene herencia múltiple (pero puede implementar tantas interfaces como desee).

Las clases abstractas son útiles cuando se necesita un comportamiento concreto de la clase base.

1

Una clase puede implementar varias interfaces , mientras que sólo puede extender una clase (abstracto o concreto), ya que Java no soporta herencia múltiple.

0

No anula una interfaz. Usted lo implementa.

Al escribir una interfaz, los implementadores pueden implementar su interfaz y también otras interfaces, además de heredar de una clase base.

Las clases abstractas se pueden implementar parcial o totalmente. La creación de un resumen de clase solo evita que se cree una instancia de un objeto de ese tipo.

1

En OOP (principalmente independiente de un lenguaje concreto) las clases abstractas son un mecanismo de reutilización para la jerarquía de clases para el comportamiento y la estructura que no es completa por sí misma. Las interfaces son un mecanismo para la especificación de requisitos en un módulo (por ejemplo, clase) independientemente de la implementación concreta. Todas las otras diferencias son detalles técnicos, importante es el uso diferente.

0

-Método sin ejecución es método abstracto, cada vez que una clase contiene uno o método más abstracto, entonces debe ser declarada como una clase abstracta

-La interfaz es totalmente abstracta que no puede tener constructor, instancia y bloques estáticos y contiene solo dos tipos de miembros 1.public abstract method 2.public-static-final variable

* No se pueden crear instancias, pero se puede crear una referencia.

* Cuál se adapta mejor depende de la aplicación -Las interfaces son útiles porque las clases de Java no son compatibles con la herencia múltiple, pero sí las interfaces.

-Las clases abstractas son útiles cuando se necesita un comportamiento concreto de la clase base.

0

Las principales ventajas de la interfaz sobre la clase abstracta es superar la ocurrencia del problema del diamante y lograr herencia múltiple. En java no se proporciona ninguna solución para el problema de rombos al usar clases. Por esta razón, la herencia múltiple se bloquea utilizando clases en Java. Entonces para lograr herencia múltiple utilizamos la interfaz.

2

Los hechos son-

  1. Java no soporta herencia múltiple
  2. múltiples interfaces pueden ser implementadas
  3. pocos métodos en una clase abstracta pueden implementarse

Estos hechos pueden ser utilizado para inclinar la ventaja a favor de interfaces o clases abstractas.

Si hay más de un comportamiento que una clase debe compartir con otras clases, las interfaces ganan. Si la definición de un método debe compartirse/anularse con otras clases, las clases abstractas ganan.

0
class Animal 
{ void move(){} } 

class Bird 
{ void move(){fly} } 

class Fish 
{ void move(){swim} } 

Ahora bien, si la clase de animal es la clase abstracta como

Animal a; 

a= new Bird(); or a = new Fish() 

Aquí, la abstracción funciona bien, pero si hay 100 objetos como Animal a[100];

No se puede escribir o new Bird().movenew Fish().move 100 veces

Uso de interfaz y escribir a[i].move. Se diferenciará como pájaro o pez y se invocará move()

En segundo lugar admite herencia múltiple ya que la clase A puede implementar tantas interfaces.

Cuestiones relacionadas