Decir para la clase ClassOne
se extiende desde ClassTwo
, classone
es la subclase y ClassTwo
es la superclase si fui a otra clase y escribí: ClassTwo hello = new ClassOne();
¿Significa esto que solo puedo usar los métodos que están en ClassOne
que han sido heredados de ClassTwo
y no los métodos que originalmente estaban en ClassOne
? (Por ejemplo, un método llamado void eat();
estaba en ClassTwo
y ClassOne
heredó pero el método void walk();
estaba solo en ClassOne
y no en ClassTwo
entonces usando el hello
palabra clave, ¿podría acceder a la función comer y nola función de caminar?), no entiendo muy bien el concepto de polimorfismo. ¿Alguien puede explicarlo de manera muy simple y dando un ejemplo? Muchas gracias.
Respuestas
1 para la respuesta № 1Sí, eso es cierto, el sistema verá classOne
como un classTwo
en lo que respecta a los métodos disponibles. Me gusta pensar en estos conceptos como cubos, en este caso classOne
cabe en un classTwo
Cubeta. Si pongo un classOne
en un classTwo
cubo solo puedo ver el classTwo
Cubeta. Sin embargo, podría elegir el classOne
desde el classTwo
balde, es decir, puedo lanzarlo.
Esto también ayuda en el caso de upcasting ydowncasting, es decir, convertir un objeto a un supertipo o subtipo. Usted pone el artículo en una cesta (hacia arriba) o lo saca de la cesta (hacia abajo).
Esta analogía puede ser una mierda, pero me ayuda :)
Para responder a su pregunta, sí, no puede hacer una llamada a un método que esté en classOne
si está fundido en un classTwo
.
Esto es útil y muchas veces preferible. Pensar en interfaces
, básicamente una interfaz le dice a su objeto queProporcionar un conjunto de métodos. De esta manera podemos asegurarnos de que estos métodos estén disponibles para todos los que llamen a ese objeto, el contrato que el objeto tiene con su entorno.
También un posible duplicado: Intenta describir el polimorfismo tan fácil como puedas
0 para la respuesta № 2
La pregunta describe, sobre todo claramente, un SSCCE que también podrías escribir y ponerte a prueba fácilmente.
La relación de un objeto de una clase con un método o campo en esa clase es "tiene un".
La relación de un subtipo con un supertipo es "es un".
En ClassTwo hello = new ClassOne();
, el tipo declarado de hello
es ClassTwo
. La expresión de la derecha se evalúa con el tipo ClassOne
pero luego se lanza para escribir ClassTwo
. Y ClassTwos no tiene un walk()
.
ClassTwos tiene un eat()
, y también ClassOnes. La magia sucede cuando también declaras void eat()
en ClassOne (con la misma firma de método quesu superclase) Anular el método de esta manera permite que se produzca un comportamiento diferente o adicional cuando ¡ClassOnes come! ... Hasta aquí he dejado caer algunos términos que seguramente puedes buscar por ti mismo. Ahora simplemente afirmaré que el término "comer" se está usando polimórficamente allí. Pero ese es solo un pequeño ejemplo. No puedo encapsular ningún concepto tan abstracto pero poderoso.