2012-04-18 13 views
20

Entiendo POR QUÉ necesitamos la clase abstracta en Java para crear subclases. Pero lo mismo se puede lograr con una clase concreta. p.ej. Class Child extiende Parent. Aquí Parent puede ser abstracto & de concreto. Entonces, ¿por qué tenemos ABSTRACTO?¿En qué se diferencia la clase abstracta de la clase concreta?

+8

Animal animal = nuevo Animal(); << ¿Qué animal? en muchos casos esto no tiene sentido, por lo tanto, clases abstractas. No puedes crear una instancia directamente. Tiene que ser un subtipo como un gato o un perro o lo que sea – Polity

+2

programáticamente, lo mismo se puede lograr si hubiéramos tenido Animal como una clase concreta. Estoy tratando de entender la razón detrás de la introducción de un concepto de ABSTRACT por los creadores de Java. –

+0

Limita la redundancia del código y también aumenta la efectividad. Además, puede imponer que cierta funcionalidad incompleta de la clase abstracta se use en la clase concreta. Es muy parecido a combinar una interfaz y una clase juntas y no es necesario implementar la interfaz en todas sus clases concretas. –

Respuesta

43

Las clases abstractas no se pueden crear instancias directamente. Declarar una clase como abstracta significa que no desea que se cree una instancia y que la clase solo se puede heredar. Estás imponiendo una regla en tu código.

Si amplía su ejemplo de relación padre/hijo para incluir una clase Persona, entonces tendría sentido que la persona sea abstracta. El padre es una idea concreta y también lo es el niño. La persona es un concepto abstracto tanto en la realidad como en el código.

Una de las ventajas es que explícitamente define y protege la idea de la clase abstracta. Cuando declaras una clase como un resumen, no hay forma de que tú o cualquier otra persona que use tu código lo use incorrectamente al crear una instancia. Este razonamiento es similar al por qué especificamos funciones y campos como públicos, privados o protegidos. Si declara una función o miembro como privado, de hecho lo está protegiendo del acceso incorrecto desde el código del cliente. Los privados están destinados a ser utilizados dentro de la clase y eso es todo. Las clases abstractas están destinadas a ser heredadas y eso es todo.

Ahora, ¿tiene que usar clases abstractas y definir funciones y campos como privados en lugar de públicos? No, no lo hace. Pero estos conceptos se proporcionan para ayudar a mantener el código limpio y bien organizado. La clase abstracta se implementa en todos los lenguajes orientados a objetos según mi conocimiento. Si miras a tu alrededor verás que C++, C#, VB.NET etc. todos usan este concepto.

Una mejor, ejemplo específico:

Shape hierarchy UML Diagram

En el ejemplo anterior la clase abstracta forma debe ser porque no es útil por sí misma.

+2

pero ¿qué beneficio obtenemos al imponer esta regla? –

+1

Reutilización de código. Implemente la función en la clase abstracta y ahora todas las subclases tienen implementado ese método. Esto se usa comúnmente cuando se implementan interfaces y múltiples implementaciones comparten el mismo código para algunos métodos. –

+1

Creo que padre/hijo/persona es una mala analogía para explicar la abstracción y la herencia: una persona es siempre un niño (de otras dos personas) y es muy común que después de un punto en el tiempo también sean padres (de algún otro persona (s)). –

6

Clase abstracta significa que es abstracta no completa. Necesita otra clase para completarlo y/o sus funcionalidades. Necesita extender la clase abstracta. Será útil con Certain class ej. Fruto todas las frutas tienen la misma propiedad que el color. Pero puede tener diferentes propiedades para diferentes frutas, como pulpa, como naranja o no, por ejemplo, plátano, etc.

+0

pero el punto es el mismo se puede lograr con una clase concreta. Estoy tratando de entender si hay algo más allá del hecho de que la clase abstracta está ahí para las clases que LOGICAMENTE no son concretas o hay algo más? –

+1

En ese caso, la respuesta es no. Puede tener toda su aplicación (incluso 100KLOC +) en una clase. Pero no lo hacemos, y hacemos diferentes clases para diferentes entidades. La clase abstracta mejora la estructura del programa –

3

El objetivo de la abstracción no es crear subclases. Se trata más de crear costuras en tu código. Desea que el código sea susceptible de prueba y desacoplado, lo que conduce al objetivo final de la mantenibilidad. Por razones similares, la abstracción también nos compra la capacidad de reemplazar un poco de código sin afectar los efectos secundarios.

4

Sé que esta es una vieja pregunta, pero parece que el cartel todavía tenía algunas preguntas sobre el beneficio de utilizar una clase abstracta.

Si usted es el único que alguna vez usará su código, entonces realmente no hay ningún beneficio. Sin embargo, si está escribiendo código para que otros lo usen, hay un beneficio. Digamos, por ejemplo, que ha escrito un marco de almacenamiento en caché pero desea permitir que los clientes creen sus propias clases de implementación de almacenamiento en caché. También desea realizar un seguimiento de algunas métricas, como la cantidad de cachés que están abiertos, hipotéticamente.Su clase abstracta podría ser algo como esto:

public abstract class AbstractCache { 
    public final void open() { 
     ... // Do something here to log your metrics 
     openImpl(); 
    } 

    protected abstract void openImpl() { } 
} 

Por su parte la clase AbstractCache es inútil y no desea que los clientes tratan de crear una instancia de uno y usarlo como una memoria caché, que serían capaces de hacer si la clase era concreta También debes asegurarte de que no puedan eludir el registro de medidas, lo que podrían hacer si les proporcionas una interfaz de caché.

2

Una clase abstracta está destinada a ser utilizada como la clase base de la que se derivan otras clases. Se espera que la clase derivada proporcione implementaciones para los métodos que no se implementan en la clase base. Una clase derivada que implementa toda la funcionalidad que falta se llama una clase concreta

0

Según mi entendimiento

Resumen Clase es una clase que simplemente describe la conducta, pero no ponerlo en práctica. Considere este ejemplo de Java para Abstract Clase:

public interface DoSomething(){ 
public void turnOnTheLight(); 
} 

clases concretas son aquellos, que han de ser implementado. Por ejemplo:

public abstract class A(){ 
     public void doIt(); 
    } 
    public class B extends A(){ 
     public void doIt(){ 
     //concrete method 
     System.out.println(“I am a Concrete Class Test”); 
    } 
} 

En otras palabras, una clase concreta en Java es cualquier clase que tiene la aplicación de todos sus miembros heredados ya sea de interfaz o clase abstracta.

Cuestiones relacionadas