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 originalclass Mamifero{
public:
//Constructor y destructor
Mamifero();
~Mamifero();
//Metodo Accesor
int ObtenerEdad();
// Propieades
protected:
int _edad;
}
class Persona : public Mamifero{
public:
//Constructor y Destructor
Persona();
~Persona();
//Metodo Accesor
String ObtenerNombre();
// Propieades
protected:
String Nombre;
}
//Notese que solo he declarado la interfaces, es decir no las he implementado
Código JS:
Código Javascript
:
Ver originalMamiferoPrototype(edad){
this.Edad = edad;
}
PersonaPrototype(name){
MamiferoPrototype.call(this , edad , name); // hago que el constructor también inicialice los argumentos del padre.
this.Nombre = nombre;
}
PersonaPrototype.prototype = new MamiferoPrototype(); /* Creo la relacion de Herencia simple */
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
Titos.Edad; // devuelve 50
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 :
- 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?
- 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 originalMamiferoPrototype(edad){
//Publico
this.ObtenerEdad(){
return Edad;
}
// Privado
var Edad = edad;
}
- ¿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?
- 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?