Me estoy preparando para una entrevista y he decidido repasar mis conceptos de POO. Hay cientos de artículos disponibles, pero parece que cada uno los describe de forma diferente. Algunos dicen
La abstracción es "el proceso de identificar patrones comunes que tienen variaciones sistemáticas; una abstracción representa el patrón común y proporciona un medio para especificar qué variación utilizar" (Richard Gabriel).
y se consigue mediante clases abstractas.
Algunos otros dicen
Abstracción significa mostrar sólo los detalles necesarios al cliente de el objeto
y
Digamos que usted tiene un método "CalculateSalary" en su clase Employee que toma EmployeeId como parámetro y devuelve el salario del empleado para el mes actual como un valor entero. Ahora bien, si alguien quiere utilizar ese método. No necesita preocuparse de cómo el objeto Employee el objeto calcula el salario? La única cosa que necesita para ser la preocupación es el nombre del método, sus parámetros de entrada y el formato del miembro resultante miembro,
He buscado en Google una y otra vez y ninguno de los resultados parece darme una respuesta adecuada. Ahora, ¿dónde encaja la encapsulación en todo esto? Busqué y encontré una pregunta de stack overflow. Incluso las respuestas a esa pregunta eran confusas Aquí, dice
La encapsulación es una estrategia utilizada como parte de la abstracción. Encapsulación
se refiere al estado de los objetos - los objetos encapsulan su estado y lo ocultan del exterior; los usuarios externos de la clase interactúan con él a través de sus métodos, pero no pueden acceder al estado de las clases directamente. Así que la clase se abstrae de los detalles de implementación relacionados con su estado. estado.
Y aquí otro reputado miembro dice,
Son conceptos diferentes.
La abstracción es el proceso de refinar todos los atributos innecesarios/importantes de un objeto y mantener sólo las características más adecuadas para su dominio.
Ahora estoy hecho un lío con todo el concepto. Conozco la clase abstracta, la herencia, los especificadores de acceso y todo eso. Sólo quiero saber cómo debo responder cuando me pregunten sobre abstracción y/o encapsulación en una entrevista.
Por favor, no lo marquen como duplicado. Sé que hay varias preguntas similares. Pero quiero evitar la confusión entre las explicaciones contradictorias. ¿Puede alguien sugerir un enlace creíble? Un enlace a la pregunta de stackoverflow también es bienvenido, a menos que vuelva a crear confusión :)
EDIT: Necesito respuestas, un poco orientadas a c#
Creo que son conceptos ligeramente diferentes, pero a menudo se aplican juntos. La encapsulación es una técnica para ocultar los detalles de la implementación a quien la llama, mientras que la abstracción es más bien una filosofía de diseño que implica la creación de objetos análogos a los objetos/procesos conocidos, para ayudar a su comprensión. La encapsulación es sólo una de las muchas técnicas que pueden utilizarse para crear una abstracción.
Por ejemplo, tomemos las "ventanas". En realidad, no son ventanas en el sentido tradicional, sólo son cuadrados gráficos en la pantalla. Pero es útil pensar en ellas como ventanas. Es una abstracción.
Si la "API de ventanas" oculta los detalles de cómo se renderiza físicamente el texto o los gráficos dentro de los límites de una ventana, eso'es encapsulación.
Como yo lo sé, la encapsulación es ocultar los datos de las clases en sí mismas, y sólo hacerlos accesibles a través de setters / getters, si se debe acceder a ellos desde el mundo exterior.
La abstracción es el diseño de la clase para sí misma.
Significa, como creas tu arbol de clases, que metodos son generales, cuales son heredados, cuales pueden ser sobreescritos, que atributos estan solo en el nivel privado, o en el protegido, como construyes tu arbol de herencia de clases, usas clases finales, clases abstraidas, implementacion de interfaces.
La abstracción se sitúa más en la fase de diseño, mientras que la encapsulación también se inscribe en la fase de desarrollo.