2010-01-19 21 views
13

¿Alguien me puede decir cuál es exactamente la diferencia entre una clase completamente abstracta y una interfaz?clase e interfaz abstractas puras

Una clase abstracta también puede tener todos sus métodos como abstractos. Una interfaz tiene todos sus métodos como abstractos. ¿Cuál es la principal diferencia entre los dos en este escenario?

Si hay una diferencia entre una clase abstracta pura e interfaz? ¿Cuál es el uso de la interfaz? Cuando se usa la interfaz, ¿podemos hacer uso de la clase abstracta pura?

Respuesta

14

Para completar las respuestas anteriores:

Una interfaz es un "contrato". Si una clase implementa una interfaz, debe proponer todos los servicios enumerados en la interfaz.

Una clase abstracta es un esqueleto. Define de cierta manera que sus clases ampliadas funcionarán al tiempo que les deja algo de espacio libre (los métodos abstractos) para ser únicos.

Una clase abstracta pura haciendo lo mismo que una interfaz, pero tienen el problema de la única que se extiende por lo que, para mí, que no tienen ningún interés

+1

Una clase abstracta pura tiene el problema de una extensión única, pero puede definir otras posibilidades de acceso que las públicas. – csblo

2

Una clase abstracta puede proporcionar una implementación, es decir, (público, protegido, privado) método cuerpos. Una interfaz solo puede declarar firmas de métodos públicos. Estos métodos deben realizarse (en forma de cuerpos de método) por clases que implementan la interfaz.

5

En Java y C#, se puede usar múltiples interfaces que se derivan de y sólo una única clase a heredar de,

+1

esta es LA respuesta –

+1

No es LA respuesta, ya que no se menciona un aspecto muy importante: las clases abstractas * pueden * tener miembros implementados. –

+1

@Wim: cierto, pero si lee el segundo párrafo de la pregunta original, está claro que el OP está interesado únicamente en aquellas clases abstractas que no tienen ningún método implementado y por lo tanto se ven casi como interfaces. – catwalk

10

Cada interfaz es implícitamente abstracta: Cada declaración de método en el cuerpo de la interfaz es implícitamente abstracta y público.

Una clase abstracta tiene métodos que pueden contener implementación. Los métodos abstractos pueden ser públicos, protegidos o acceso predeterminado (paquete visible). A diferencia de las interfaces, las clases abstractas pueden contener campos que no son estáticos y finales.

Véase también:
Interfaces vs Abstract classes y la Java tutorial

0

Una clase puede implementar múltiples interfaces, pero sólo se extienden desde una clase (abstracto o de otro tipo). Si necesita especificar una interfaz, entonces debe usar una interfaz, para que las clases puedan implementar múltiples de sus interfaces.

2

Hay tres diferencias:

  1. Interfaces sólo puede declarar métodos públicos (es decir, no hay métodos visibles protegidas o paquete y privado) y no se puede declarar cualquier campo
  2. subclases sólo puede extenderse a lo sumo una clase abstracta , pero puede implementar cualquier número de interfaces
  3. la clase abstracta puede también tienen implementaciones para algunos o todos los métodos
+0

Y una clase abstracta * puede * tener métodos implementados. –

1

Puede usar la interfaz para la herencia múltiple, pero no puede usar la clase abstracta para la herencia múltiple.

Todos los métodos en la interfaz son públicos por defecto, en clase abstracta, solo los métodos que ha establecido como resumen deben declararse públicos.

1

sólo voy a tratar un punto (principalmente porque las otras preguntas ya se han abordado):

"¿Dónde se utiliza la interfaz podemos hacer uso de la clase abstracta pura?"

En teoría, podrías. Sin embargo, perderá flexibilidad y perderá el acoplamiento hasta cierto punto. Es mucho más preferible codificar las interfaces y pasarlas, especialmente en escenarios de Inversión de control (IoC) y desde un punto de vista de integración, ya que esto permite una extensibilidad mucho mayor.

2

Dado que la pregunta es sobre pure clases abstractas, entonces diría que la respuesta va a estar relacionada con la herencia y el alcance. Es algo que me he preguntado muchas veces y esto es lo que se me ocurrió.

Obviamente las características relacionadas con la herencia múltiple han sido respondidas previamente, así que no voy a entrar en nada de eso. Sin embargo, el alcance es grande.

En una interfaz no se puede definir modificadores de acceso de un afiliado, ya que son implícitamente públicos, ... que está definiendo la interfaz públicapor su posterior ejecución. Hay una diferencia importante allí ya que puede definir un miembro abstracto protegido en una clase abstracta pura.

Heredar de una definición de tales clases obligaría a la heredera de implementar el miembro abstracta, sino el alcance de forma privada a los consumidores de la clase (aunque tendría que ser definida como protected por lo menos que la clase fue marcado como sealed más herederos tendrían acceso).

En esencia, puede definir una interfaz privada utilizando clases abstractas puras. Si esa es una buena idea es una pregunta diferente en conjunto, pero un buen uso que he visto utilizar es hacer cumplir los patrones de diseño y estandarizar los diseños de clase.

HTH

+2

No hay palabra clave 'sealed' en Java; la subclase debería estar marcada como 'final'. –

3

No es una explicación muy theorotical pero, programáticamente que todo es correcto

        Interface     Abstract Class 
Extend Class       No       Yes 
Extend Abstract Class     No       Yes 
Implement Interface      Yes(Extend Interface)  Yes 
Variables        Public Static Final   Public/Protected/Private/static/final/transient/volatile 
Contain Non-Public Method    No       Public/Protected/*Private 
Contain Abstract Method     Yes       Yes 
Contain No-Body, Non-Abstract Method Yes       No 
Contain Defined Method     No       Yes 
Contain Main Method      No       Yes 

* Las clases abstractas pueden tener métodos privados, pero no los métodos privados abstractos.

3

Una razón para elegir la interfaz puramente abstracta es forzar a las subclases a implementar métodos particulares que son implementados por una súper clase.

Por ejemplo (en Java),

decir que quieres que se extienden a todas las clases para implementar toString(), es igual a() y hashCode().

Puede crear una interfaz llamada ForceSomeMethods para ese contrato, pero esos métodos están implementados implícitamente por Object.

Al hacer de ForceSomeMethods una clase abstracta pura con toString(), etc. como métodos abstractos, todas las subclases se verán forzadas a implementar esos métodos.

+0

Esta es una respuesta REALMENTE interesante, y una que no había visto en otra parte. No es toda la respuesta, sino un detalle muy valioso. –

Cuestiones relacionadas