Ver Mensaje Individual
  #7 (permalink)  
Antiguo 03/06/2013, 18:45
Avatar de Albuss
Albuss
 
Fecha de Ingreso: enero-2012
Ubicación: Coruña
Mensajes: 475
Antigüedad: 12 años, 10 meses
Puntos: 30
Pregunta Respuesta: Peticion : Articulos sobre Polimorfismo y Relaciones entre clases deribada

Te tomo la palabra pues, solo pido algo de paciencia ya que por ahora me gustaría asentar algunos conocimientos antes de preguntar sobre los patrones. Bien, Tratar las herencias en JS, voy a exponer un ejemplo en C++ y otro en JS, voy a tratar de abstraer el ejemplo lo máximo posible, es decir, tratar de ser lo mas simple y directo que pueda. Voy a declarar una relación entre clases de derivación (herencia simple) y luego con mis conocimientos tratare de hacer lo mismo en JS, para finalmente hacer mis preguntas.


Código C++:
Ver original
  1. class Mamifero{
  2.  
  3.  public:
  4.  
  5. //Constructor y destructor
  6.    Mamifero();
  7.    ~Mamifero();
  8.  
  9. //Metodo Accesor
  10.    int ObtenerEdad();
  11.  
  12. // Propieades
  13.  protected:
  14.  
  15.    int _edad;
  16. }
  17.  
  18.  
  19. class Persona : public Mamifero{
  20.  
  21.  public:
  22. //Constructor y Destructor
  23.    Persona();
  24.    ~Persona();
  25.  
  26. //Metodo Accesor
  27.    String ObtenerNombre();
  28.  
  29. // Propieades
  30.  protected:
  31.  
  32.   String Nombre;
  33. }
  34.  
  35. //Notese que solo he declarado la interfaces, es decir no las he implementado


Código JS:

Código Javascript:
Ver original
  1. MamiferoPrototype(edad){
  2.  
  3.    this.Edad = edad;
  4.  
  5. }
  6.  
  7. PersonaPrototype(name){
  8.  
  9.    MamiferoPrototype.call(this , edad , name); // hago que el constructor también inicialice los argumentos del padre.
  10.    this.Nombre = nombre;
  11.  
  12. }
  13.  
  14.  
  15. PersonaPrototype.prototype = new MamiferoPrototype(); /* Creo la relacion de Herencia simple */
  16. var Titos = new PersonaPrototype(50, 'Titos'); // Instancio un objeto del prototipo persona y le paso al constructor los parametros iniciales tanto de mamifero como de persona
  17.  
  18.  
  19. Titos.Edad; // devuelve 50
  20. Titos.Nombre // devuelve Titos


Un montón de preguntas se acumulan acerca de estos dos ejemplos, tratando de se lo mas simple y directo posible llevare acabo una lista :
  1. En C++ se que estoy llevando una relación entre clases de derivación, es decir, de la clase Base (Mamifero) a la clase derivada (Persona), pero en JS no se exactamente cual es la relación entre los dos prototipos, en C++ al declarar la clase derivada Persona, es necesario al declararla describir el tipo de relación (class Persona : public Mamifero), es decir, cuando declaro la clase declaro la relacion, en cambio en Js primero declaro los dos prototipos, luego declaro una sentencia en la cual enlazo al prototipo de persona con el de mamifero, ¿ que tipo de relacion estoy estableciendo? ¿alternativas? ¿es correcto?


  2. En C++ tiene mucha importancia declarar el alcance de cada una de las partes de la clase, Public, Private, Protected , Esto tiene que ver sobretodo con la encapsulación, que es uno de los pilares de POO, C++ es un lenguaje de nivel medio, me pregunto cuan es la importancia de declarar el alcance de las partes de un prototipo en JS que es un lenguaje de alto nivel, notese que no he declarado ninguna propiedad como privada en JS, pero seria algo asi :

    Código Javascript:
    Ver original
    1. MamiferoPrototype(edad){
    2.  
    3.    //Publico
    4.  
    5.    this.ObtenerEdad(){
    6.    return Edad;
    7.    }
    8.    // Privado
    9.  
    10.    var Edad = edad;
    11.  
    12. }
  3. ¿Que importancia tiene?, en C++ se usa la Protected en vez de private por que los métodos privados no son accesibles por la clase derivada, ¿esto es así en JS?


  4. En JS el constructor es la propia función, ¿cual es la relación entre los constructores de la herencia que he creado en js? ¿limitaciones? , Por que tengo que hacer una sentencia explicita para que la clase derivada también inicialice los argumentos del padre? (MamiferoPrototype.call) , ¿por que esto no ocurre de forma "automatica" cuando declaro la herencia, como en C++? ¿como funciona y porqué, para que tenga que ser asi?

Última edición por Albuss; 04/06/2013 a las 05:04