2012-09-26 25 views
6

acuerdo con http://www.cs.cornell.edu/courses/cs211/2006sp/Lectures/L08-abstraction/08_abstraction.htmlabstracción vs clase abstracta

abstracción viene en dos sabores. Una es la abstracción de funciones y la otra es la abstracción de datos. ¿Pero dónde encajan las clases abstractas? Por lo que veo, las clases abstractas son un concepto totalmente diferente y aunque el nombre sugiere que tiene algo que ver con los principios de OOP.

¿Alguien podría arrojar algo de luz sobre esto?

+0

http://www.javacoffeebreak.com/faq/faq0084.html. –

+0

@ crowso- ¿aún no está satisfecho con las respuestas? Por favor, acepte una de las respuestas –

Respuesta

2

Wiki pone mucha precisión

Abstracción de datos

resumen de los datos hace cumplir una clara separación entre las propiedades abstractas de un tipo de datos y los detalles concretos de su aplicación. Las propiedades abstractas son aquellas que son visibles para el código del cliente que hace uso del tipo de datos, la interfaz para el tipo de datos, mientras que la implementación concreta se mantiene completamente privada y puede cambiar, por ejemplo, para incorporar mejoras de eficiencia a lo largo del tiempo. La idea es que dichos cambios no tengan ningún impacto en el código del cliente, ya que no implican ninguna diferencia en el comportamiento abstracto. Por ejemplo, se podría definir un tipo de datos abstractos llamado tabla de búsqueda que asocie las claves de forma única con los valores y en los que se puedan recuperar los valores especificando sus claves correspondientes. Dicha tabla de búsqueda puede implementarse de varias maneras: como una tabla hash, un árbol de búsqueda binario, o incluso una simple lista lineal de pares (clave: valor). En lo que respecta al código del cliente, las propiedades abstractas del tipo son las mismas en cada caso.

Considere, por ejemplo, un ejemplo de fragmento de Java para representar algunos "animales" agrícolas comunes a un nivel de abstracción adecuado para modelar aspectos simples de su hambre y alimentación. Se define una clase de animales para representar tanto el estado del animal y sus funciones:

public class Animal extends LivingThing 
{ 
    private Location loc; 
    private double energyReserves; 

    public boolean isHungry() { 
     return energyReserves < 2.5; 
    } 
    public void eat(Food f) { 
     // Consume food 
     energyReserves += f.getCalories(); 
    } 
    public void moveTo(Location l) { 
     // Move to new location 
     loc = l; 
    } 
} 

Con la definición anterior, se podría crear objetos de tipo animal y llamar a sus métodos de esta manera:

thePig = new Animal(); 
theCow = new Animal(); 
if (thePig.isHungry()) { 
    thePig.eat(tableScraps); 
} 
if (theCow.isHungry()) { 
    theCow.eat(grass); 
} 
theCow.moveTo(theBarn); 
0

Los objetos en general combinan datos con funcionalidad, y una clase abstracta no es una excepción a eso. En algunos casos, la abstracción proporcionada es información casi pura, con funciones solo para proporcionar acceso a los datos (por ejemplo, clases de recopilación). Otros casos son casi lo opuesto (por ejemplo, la abstracción proporcionada por un functor en C++ generalmente es más o menos una función).

Esos, por supuesto, son los extremos - muchas (¿la mayoría?) Caen en algún lugar entre ellos.

+0

Sí, este es mi argumento. Pero no ha mencionado sobre la clase abstracta y el concepto abstracto si esos dos son iguales o diferentes? – crowso

+0

@ user581544: Mi punto es que una clase abstracta * puede * representar una o ambas en diversos grados. –

5

Estos son conceptos muy diferentes.

La abstracción es similar al concepto de una caja negra. La entrada entra, la caja negra hace algo, sale la salida. No importa lo que suceda en la caja negra, todo lo que debes saber es que funciona. Un ejemplo de la vida real de esto es la función hash de Java, todo lo que el usuario tiene que saber es que tiene el valor de entrada en hashes, no le importa al usuario cómo se obtiene el hash del número. La caja negra es la abstracción. El punto es que no tienes que saber cómo funciona, solo que sí.

Las clases abstractas (al menos en Java) son una mezcla entre interfaces y clases de OOP completas. Una interfaz define los métodos que debe tener cualquier clase extendida, es un acuerdo en el código que implementará la interfaz correctamente y asegura que todo funcionará como se espera.Una clase abstracta tiene estos métodos vacíos (acuerdos) y también tiene métodos totalmente implementados que se pueden llamar.