Si no les imprime lo de UberVan, no agreguen la variable passenger en la clase UberVan porque les genera conflicto y provoca que no se le asignen los 6 pasajeros a passengers.
Para que funcione en la clase Car.java la variable passengers deberá estar encapsulada con el modificador de acceso protected para que las subclases tengan acceso a esa variable.
classCar{//Definición de la claseprivateInteger id;privateString license;privateAccount driver;protectedInteger passengers;
Muchas gracias, tu codigo me sirvio tal cual, ahora me surge la pregunta, ¿Que pasa con passengers dentro get y set dentro de la clase car? ¿Sigue siendo necesario?
Qué bueno que te sea de utilidad, @Javier54. 🤓
Creo que en este punto hay unos conceptos que se pueden confundir, son en especifico 3:
Sobrecarga -> Principalmente con los métodos
Sobre-escritura -> Debe haber herencia, Cuando le cambias el comportamiento a un método que definió la super-clase
Polimorfismo de Subtipado -> Centrado en usar el mimos nombre de método en diferentes clases, cuando se llamen se ejecutara
Daré unos ejemplos de cada uno con python:
Sobrecarga
Según algunos autores se le llamaría polimorfismo de sobrecarga, algunos ni si quiera lo llaman polimorfismo así que lo dejare:
classpunto:# Nótese que no ninguna clase de herenciadef__init__(self, x):# Creo cualquier método, en este caso el constructor self.x = x
def__init__(self, x, y):# Mi primer caso de sobrecarga self.x = x
self.y = y
def__init__(self, x, y, z):# Mi segundo caso de sobrecarga self.x = x
self.y = y
self.z = z
Como pueden ver puede ser productivo en algunos casos, pero empieza a ser contraproducente cuando se usa demasiado(en el segundo caso por ejemplo).
Sobre-Escritura
Un caso puro de polimorfismo, busca alterar el método de la súper-clase, ya que el comportamiento es diferente
classAve:# Nuestra Super-Clasedef__init__(self, altura_vuelo): self.altura_vuelo = altura_vuelo
defaccion_animal(self):# Nuestro metodo a sobre-escribir# Obvia que todos volaranprint("El ave volara a una altura {}".format(self.altura_vuelo))classPingüino(Ave):# Clase Hija o Sub-Clasedef__init__(self, altura_vuelo, velocidad_nado):# Puse otro parametro para diferenciar un poco el metodosuper.__init__(self, altura_vuelo)# pongo los metodos de la super-clase self.velocidad_nado = velocidad_nado
defaccion_animal(self):super.accion_animal()# Hagamos que tambien muestre esoprint("El Ave nadará con una velocidad {}".format(self.velocidad_nado))# Tiene Su comportamiento diferente
Realmente muy útil, es l a mejor practica ya que la herencia podrá extender el proceso y si se quiere generar una particularidad se hace una clase
Polimorfismo de sobrecarga
Yo lo llamaría una "mala practica de uso para la sobrecarga", prefiero usar la herencia y lo sobre-escribo, sin embargo la opción esta ahí
classPingüino:# No hay ningun clase de herenciadef__init__(self, velocidad_nado, velocidad_correr): self.velocidad_nado = velocidad_nado
self.velocidad_correr = velocidad_correr
defaccion_animal(self):# Tengo que definir el mismo nombreprint("El Ave nadará con una velocidad {} y corre a una velocidad {}".format(self.velocidad_nado, self.velocidad_correr))classAguila:# No hay ninguna clase de herenciadef__init__(self, fuerza_garras, velocidad_vuelo): self.velocidad_vuelo = velocidad_vuelo
self.fuerza_garras = fuerza_garras
defaccion_animal(self):# Tengo que definir el mismo nombreprint("El Ave atacara a su victica con una velocidad de {} y una fuerza de {}".format(self.velocidad_vuelo, self.fuerza_garras))# Cuando se llame se deberia ejecutar el metodoaves =[Pingüino("100","120"), Aguila("120","300")]# Numeros hipoteticosfor ave in aves: ave.accion_animal()
Este ultimo me parece algo innecesario pero que también se puede hacer sin necesidad de heredar.
Otra cosa que de pronto se me escapo pero es porque python al ser débilmente tipado puede hacer de forma natural y es el termino llamado Cohersion, algo que en Java puede compilarse un poco mas.
Una duda, super ¿no lleva parentesis?
Es decir super().__init__(self, altura_vuelo)
Buenísima explicación, muchísimas gracias!!!
En los dos últimos temas y tal vez, de lo más relevantes en principios básicos de la OOP (encapsulamiento y polimorfismo) no se hicieron casos prácticos en los otros lenguajes que habíamos venido trabajando.
No a todos nos gusta Java :(
Exacto, si el curso comenzó con la intención de usar los 4 lenguajes, debe terminar así, y no quedarse en el camino.
En todo caso, mejor hubiera sido decir que todos los ejemplos serán con java desde un inicio.
Me parecé que lo hicieron porque sacaron nuevos cursos de POO enfocados en los lenguajes (PHP y Python). Sin embargo, es verdad que se siente como si hubiera quedado un vacío.
Aporte Extremadamente infravalorado.
Veo algo malo en tu lógica, ¿cómo frena un avión?
Cuiden más las clases. Esta y la anterior se nota la improvisación, y falta de preparación.
No es improvisación. Esta haciendo código en el instante. Es decir que esta moestrando sus conocimiento en bruto al mostrar su capacidad de correguir errores en el momento. Algo que todos nosostros quisieramos desarrollar.
Pero si se nota un poco que descuidaron el curso porque iniciaron explicandonos en los diferentes lenguajes ya a la final solo explican en Java... y al inicio comenzaron con unas ilustraciones muy claras que ayudaban a entender los conceptos pero no se volvieron a utilizar casi.
Polimorfismo: Construir métodos con el mismo nombre pero con comportamiento diferente
System.out.println(" Simple !");
Gracias!
Deja mucho que desear que se tenga en todo el código la palabra Passenger escrita de dos maneras y la instructora no lo mencione, también deja mucho que desear que cuando quieren aplicar polimorfismo a la clase uberVan no mencionen que el modificador de acceso private en la variable Passenger generara conflictos por que la subclase uberVan no podrá acceder a ella, si una persona no coloca un comentario diciendo que el modificador de clase correcto es protected me quedo patinando en ese problema.
passegenger != passenger
Así es.
🔆 Generando polimorfismo en lenguaje Dart.
import'account.dart';classCar{ int _id;String license;Account driver; int _passenger;Car({this.license,this.driver});voidprintDataCar(){if(_passenger !=null){print('License: $license Name Driver: ${driver.name} Passengers: $passenger');}} int get passenger => _passenger;setpassenger(int value){if(value ==4){ _passenger = value;}else{print('Necesitas asignar 4 pasajeros');}} int get id => _id;setid(int value){ _id = value;}}
me hubiera gustado saber como se hace en Python :\ he quedado medio decepcionada de este curso. Demasiados lenguajes confunden y no permiten profundizar.
si hay uno de POO para python aqui, pero aun no lo eh cursado a ver que tal, espero les sirva!!
Comparto tu punto de vista
Polimorfismo significa que un solo método puede tener un número de implementaciones diferentes.
Grandioso.
¿Soy el unico que se ha dado cuenta que a la profesora no le imprimió uber van?
Ahora veo porque tanta bronca para imprimir uber van ni a la profa le salio jajajaja
La solución que encontré fueron variadas y muy buenas, las resumo aquí:
De antemano hay que modificar el atributo passegenger a protected, para que se pueda acceder desde todas las clases heredadas, de ahí solo dejó el codigo con las 3 diferentes formas en las que puedes asignar un valor a passegenger.
Para los 2 primeros casos no tienes que declarar otra variable passenger dentro de uber van, para el ultimo sí por lo que es el ultimo método que recomiendo.
Esto de no dejarte las cosas claras e investigarle, esta chido, gracias a la profesora por este método tan eficiente, aprendí un buen C:
Para poder modificar la cantidad de pasajeros sin tener que crear otro atributo protected Integer passenger; asi las clases hijas pueden modificar su valor
Sí. Yo no sé por qué Anahí añadió ahí otro atributo. Será que estemos mal al usar el atributo padre? Es lo que se tiene que hacer al usar polimorfismo, no?
De aquí me surgen 2 preguntas:
La primera es que si pones si escribes super.passenger(passenger); mandas tu dato al passenger de la clase Car y ¿Este te hace la comparación de 4 pasajeros, por lo que te va a estar imprimiendo que solo permite 4 pasajeros, verdad?
La segunda es que, si tengo acceso con protected desde todas las clases heredadas ¿Necesito el metodo getter y setter?
Que buenos apuntes tienes, me gustan mucho.
Gracias por compartirlos.
Estoy de acuerdo con @cesar-de-la-lima, puse las vacilaciones en las clases hijas: UberX, UberBlack, UberVan, UberPool.
Y de esta forma no tube que aggregar la variable passengers a UberVan.
Interesante, pero tuviste que sobrescribir el mismo metodo de printDataCar() en UberX, UberPool y UberBlack, podemos ahorrarnos eso, cambiando primero la propiedad passenger a protected, así esta podrá ser seteada desde las clases hijas, lo que quiere decir que no tengo que agregar la variable passenger en las otras clases, haciendo que solo en UberVan tenga que hacer polimorfismo para el printDataCar().
Faltó la clase de Encapsulamiento en Python y JavaScript.. es una lástima.. solo se usarlo en Python pero si queria saber como se hacia en JavaScript..
Ya llegaste hasta aca, no te rindas!
falta poco!
Al final sigue sin gustarme PHP :(
Creo que se puede mejorar esta clase terminando el ejercicio, ambos conceptos (polimorfismo y encapsulamiento) dan para mucho. No se terminan de desarrollar los conceptos y pienso que terminando el ejercicio de este vídeo se podría entender mejor, abajo dejo el código funcional para el ejercicio, puesto que como esta en el vídeo no funciona la mitad. (Utilizo uberpool como si fuera uberVan por practicidad).
classMain{publicstaticvoidmain(String[] args){System.out.println("Mi primer linea en Java\n");UberX uberX =newUberX("DNS786",newAccount("Dario Arcos","12345"),"Renault\n","Logan");UberPool uberPool =newUberPool("FPA123",newAccount("Felipe","12345"),"audi","A7"); uberX.setPassenger(4); uberPool.setPassenger(6); uberPool.printCarResults(); uberX.printCarResults();}}
El curso empieza a distorsionarse mucho en estas últimas clases, por ejemplo:
No terminan explicando los 4 lenguajes con los que empezaron
Los conceptos de encapsulamiento y polimorfismos tienen pocos ejemplos y no dejan claridad con las diferencias entre modificadores de acceso
De acuerdo..
Así Sobrescribí en Python el method setPassenger en la clase UberVan para aplicar polimorfismo según la lógica de negocio para UberVan: