Si está familiarizado con la biología, es una manera súper fácil de entender la POO.
Considere un coyote, un lobo y un fennec: todos son cánidos. Debajo de esto, el coyote es Canis Latrans, el lobo es Canis Lupus y el fennec es Vulpes Zerda.
Para representar esto usando OOP, comenzaría definiendo la Clase base para Canidae: todo lo que esperaría utilizar que es común a todos ellos iría aquí. Todos tienen tamaño, peso, color de pelaje y similares: estas son las propiedades de la clase Canidae. Cualquier acción que puedan realizar (comer, cagar, llamar, correr, etc.) son métodos de la clase Canidae.
Aunque el lobo y el coyote son del mismo género, nuestro pobre y pequeño fennec está solo. Aquí, definiría dos clases más, cada una de las cuales heredaría de Canidae. Cualquier atributo o habilidad específica que el lobo y el coyote tengan pero que el fennec no tenga sería Propiedades y métodos de la clase Canidae :: Canis. Cualquier atributo específico exclusivo del fennec sería Propiedades y métodos de la clase Canidae :: Vulpes.
- Estoy persiguiendo un ACM. No me gusta programar. ¿Que puedo hacer?
- No puedo manejar las caídas de la montaña rusa. ¿Puedo seguir siendo astronauta?
- ¿Por qué el reloj de mi computadora necesita NTP para sincronizarse y el reloj digital de mi automóvil no? ¿Por qué los relojes digitales pierden su precisión tan fácilmente?
- Recientemente me he vuelto bueno en la búsqueda de patrones de series numéricas. ¿En qué parte de la vida real puedo usar esta habilidad mía?
- Soy un estudiante graduado que comenzó recientemente la Maestría en Ciencias de la Computación (Investigación) y planeo adoptar un cachorro. ¿De qué debo saber?
Todavía hay diferencias entre el coyote y el lobo, por lo que necesitamos dos clases más, cada una de las cuales hereda de Canis, que hereda de Canidae – Canidae :: Canis :: Latrans y Canidae :: Canis :: Lupus. Dado que nuestro fennec es el único Canidae :: Vulpes que estamos usando, no necesitaremos crear una Clase Zerda para él.
Pero nos hemos encontrado con un problema: los lobos y los coyotes hacen ruidos, pero hacen diferentes tipos de ruidos. Aullan igual, y ambos se quejan, pero los coyotes no pueden ladrar. El fennec no aulla, pero puede ladrar, quejarse y llorar.
Dado que los tres pueden Whine, y Canidae es la Clase común que comparten los tres, ahí es donde ponemos el Método Whine, que, dado que es la Clase raíz, significa que podemos acceder a Whine desde CUALQUIERA de nuestras Clases de la misma manera.
Solo el lobo y el coyote pueden aullar, por lo que no tiene sentido ocupar espacio en Vulpes (que hereda de Canidae). Latrans y Lupus heredan de Canis, por lo que Canis es donde ponemos el Método Howl. Ni el lobo ni el coyote pueden llorar como el fennec, por lo que la única clase que lo necesita es Vulpes.
(Otra opción sería definir Howl en la clase Canidae, luego crear un alias para Howl en la clase Vulpes llamado Cry).
La corteza es un verdadero bicho raro en este ejemplo. En la mayoría de los lenguajes OOP, lo ubicaríamos en la clase Canidae como un método virtual , definiendo el formato que usarían las clases heredadas, pero en realidad no existe hasta que esté definido en las clases que lo usarán (Lupus y Vulpes) .
El resultado práctico de todo esto es que hemos incorporado una gran capacidad en nuestro programa con muy poco código redundante. Podemos hacer una lista de cánidos que podría ser cualquier combinación de lobos, fennecs y coyotes y podemos acceder a todos de la misma manera.
Este es un resumen básico de la herencia .
Si terminamos con conflictos, como mezclar carnívoros y herbívoros en la misma lista, podemos definir un método de comer de una manera para carnívoros, de manera diferente para herbívoros, y aún así podemos llamar a Animal.Eat pase lo que pase.
Bienvenido al polimorfismo .
Lo realmente bueno de las clases es que son solo planos: en realidad no existen hasta que los instancia como un objeto. De la misma manera, puedes sacar medio millón de objetos de una clase tan fácilmente como uno.
Digamos que hicimos nuestras clases como se indica arriba e instanciamos tres objetos usando Canidae :: Canis :: Lupus – Wolf (1), Wolf (2) y Wolf (3). En algún lugar del camino, llamas a Wolf (2). Eat (LittleRedRidingHood) – Wolf (2) ahora está saciado pero Wolf (1) y Wolf (3) todavía tienen hambre. Todo se mantiene bien y ordenado porque los Métodos que definió en la Clase solo pueden afectar ese Objeto en particular.
Y ahora entiendes la encapsulación .
Y eso es más o menos en pocas palabras.