2010-09-28 13 views
10

¿Hay alguna razón para usar una clase 100% abstracta y no una interfaz? ¿Puede darme un buen ejemplo de cuándo usar ambos para poder captar un poco el concepto?Clase abstracta 100% frente a la interfaz

Actualización: Clase abstracta del 100% -> clase abstracta con solamente métodos abstractos. Soy curioso si hay diferencias entre php y java con respecto a este aspecto.

Update2: Incluso si entiendo la mayoría de las razones estoy más interesado en el conceptual más de razones técnicas.

+0

cómo definir 'clase 100% abstracta'? –

+0

java o php? ¿cuál es? – Thilo

+3

Creo que se refiere a una clase abstracta con solo métodos abstractos, sin implementaciones predeterminadas –

Respuesta

18

Si por "clase 100% abstracta" te refieres a "clase abstracta sin métodos concretos", entonces puedo pensar en una razón: visibilidad.

Puede definir un método abstracto para protegerlo y, por lo tanto, no formar parte de la API pública de la clase. Sin embargo, eso parece un diseño extraño.

Otra cosa que me vino a la mente es cuando espera agregar funcionalidad común a la clase base, es decir, si es probable que todos los implementadores compartan algunos métodos de utilidad, pero estos métodos no se implementan.

Otra cosa: variables de instancia. Puede tener variables de instancia heredables en la clase abstracta.

+6

en una clase 100% abstracta, también puede definir variables no constantes que pueden heredarse. No es posible con las interfaces. –

+0

@Benoit Courtine exactamente. Estaba agregando esto mientras comentabas :) gracias de todos modos. – Bozho

+2

otra cosa son los constructores ... esto tampoco es posible en las interfaces –

0

100% La clase abstracta no es buena idea. Para la estructura común de clases de niños usa Interface. Para clases similares con los mismos métodos y no otros, es mejor utilizar Abstract Class.

2

Junto a la visibilidad, otra razón podría ser la de poder especificar un determinado constructor que desee implementar en todas las implementaciones o definir una propiedad determinada. Pero, en general, estoy de acuerdo con Alexander en que una clase 100% abstracta no es una buena idea. Preferiría una interfaz en la mayoría de los casos a menos que haya una muy buena razón para no usar una interfaz.

1

Personalmente creo que la diferencia es más conceptual que técnica. Por ejemplo, sería una mala idea tener una interfaz llamada "Humana" e implementarla en Hombres y Mujeres. Tendría más sentido hacer al Humano como clase.

Puede implementar múltiples interfaces y debería ver las interfaces como complementos.

+0

¿Cómo es exactamente una mala idea tener una interfaz Humana? –

+0

Los hombres y las mujeres comparten la funcionalidad, no son implementaciones diferentes de una interfaz común. Además, el concepto de ser humano no está definido por las funciones que los humanos implementan. –

+0

Incluso hay pautas de interfaz humana ;-) – Thilo

11

El único caso donde una "clase 100% abstracta" puede ser ventajosa sobre una interfaz es en lugares donde la estabilidad API es una preocupación clave.

Si escribe una API donde se espera que otras personas implementen su interfaz, debe apegarse a la interfaz. No puede agregar ningún método a la interfaz más adelante porque eso rompería todos los clientes (tendría que solucionar esto implementando una segunda interfaz y permitir que su código compruebe el uso con checks de instancia y proporcione un respaldo).

Si realiza lo mismo con una clase, puede agregar métodos (no abstractos) más adelante sin romper el cliente.

+1

+1. Este es un problema con las interfaces JDK como java.sql.Connection, donde agregan métodos todo el tiempo, por lo que las implementaciones antiguas ya no compilan. – Thilo

+0

Si las interfaces de colección fueran clases abstractas "puras", no necesitaríamos métodos de defensa. –

1

No estoy muy seguro de cómo responder a esta conceptualmente más, pero en la práctica utilizar las interfaces por las siguientes razones:

  • para indicar diferentes clases tienen una interfaz compartida: que se pueden manipular/uso ellos de la misma manera
  • se puede implementar múltiples interfaces, pero sólo extender una clase

Razones para el uso de clases abstractas:

  • Para compartir la funcionalidad entre objetos similares. Por ejemplo, Porshe911 podría extender Auto, sobrescribir algunos métodos y guardar el resto.
  • Para escribir marcos que las personas puedan adaptar. Por ejemplo, dejando unos pocos métodos cruciales sin implementar y escribiendo el resto de la clase para que sea internamente consistente, siempre que implemente esos pocos métodos. Un ejemplo sería una clase de menú con un único método abstracto getMenuItems()

Su ejemplo de la clase 100% abstracta me parece insensato. Por lo que puedo ver, eso lo convertiría en una interfaz, con la restricción añadida de que solo puedes tener uno.

0

Aquí hay un ejemplo simple que solo se puede lograr mediante la interfaz.

interface P { 
    void p(); 
} 

interface Q { 
    void q(); 
}  

interface R { 
    void r(); 
} 

class PQR implements P, Q, R { 
    @Override 
    public void p() { 
     System.out.println("P"); 
    } 

    @Override 
    public void q() { 
     System.out.println("Q"); 
    } 

    @Override 
    public void r() { 
     System.out.println("R"); 
    } 
} 

class A { 
    public void a(P pRef) { 
     pRef.p(); 
    } 
} 

class B { 
    public void b(Q qRef) { 
     qRef.q(); 
    } 
} 

class C { 
    public void c(R rRef) { 
     rRef.r(); 
    } 
} 

public class InterfaceDemo { 
    public static void main(String[] args) { 
     P p = new PQR(); 
     A ainvoker = new A(); 
     ainvoker.a(p); 

     Q q = new PQR(); 
     B binvoker = new B(); 
     binvoker.b(q); 

     R r = new PQR(); 
     C cinvoker = new C(); 
     cinvoker.c(r); 
    } 
} 
Cuestiones relacionadas