En nuestro ejemplo de gato, pudimos crear una instancia de nuestro gato y proporcionarle un nombre por separado. Sin embargo, puede ser deseable requerir que el gato sea nombrado en la instanciación para que no olvidemos accidentalmente nombrar un gato. Los constructores nos permiten controlar la instanciación.
De forma predeterminada, JS ++ proporciona un constructor para usted. Esto se conoce como el «constructor predeterminado». JS ++ lo define implícitamente si no tiene ningún constructor que haya definido explícitamente. El constructor predeterminado no acepta argumentos y solo devuelve una nueva instancia de la clase. Para comprender el constructor predeterminado, podemos definirlo explícitamente:
external $; module Animals { class Cat { string _name; var $element = $( """ <div class="animal"> <i class="icofont icofont-animal-cat"></i> </div> """ ); Cat() { } property string name() { return _name; } property void name(string name) { _name = name; } void render() { $element.attr("title", _name); $("#content").append($element); } } }
Si intenta compilar el proyecto, no debería haber problemas. El motivo es que estamos instanciando la clase ‘Cat’ sin argumentos en nuestro archivo main.jspp. Si intenta proporcionar algunos argumentos, obtendrá un error de compilación por código incorrecto.
Como puede ver en nuestro constructor predeterminado definido explícitamente, el constructor no tiene parámetros. Además, no hace nada. (Los constructores sin acciones aún devolverán una nueva instancia de la clase. Las declaraciones explícitas de ‘retorno’ dentro de los constructores son innecesarias y no están permitidas porque los constructores siempre devuelven una nueva instancia de la clase).
Un uso particular de los constructores es inicializar campos a valores personalizados. En este momento, si crea una instancia de la clase ‘Cat’, obtendrá el campo ‘_name’ como una string vacía. Si queremos que las instancias de ‘Cat’ siempre tengan un nombre, debemos solicitarlo durante la creación de instancias especificando un constructor.
Primero, elimine los métodos getter y setter. En segundo lugar, cambie el constructor explícito que definimos para que tome un parámetro: una ‘string’ para el nombre del gato. Finalmente, inicialice el campo con el argumento proporcionado al constructor. (Ya deberías saber cómo hacer esto).
Su código en Cat.jspp ahora debería verse así:
external $; module Animals { class Cat { string _name; var $element = $( """ <div class="animal"> <i class="icofont icofont-animal-cat"></i> </div> """ ); Cat(string name) { _name = name; } void render() { $element.attr("title", _name); $("#content").append($element); } } }
A continuación, tenemos que cambiar main.jspp:
import Animals; Cat cat1 = new Cat("Kitty"); cat1.render(); Cat cat2 = new Cat("Kat"); cat2.render();
Compile el proyecto. Abra index.html en su navegador web. Deberías volver a ver a los dos gatos. Pase el cursor sobre sus imágenes. Deberías volver a ver sus nombres.
Es importante tener en cuenta que el constructor predeterminado definido implícitamente (que toma cero argumentos) ya no está definido. Una vez que defina explícitamente un constructor para una clase, el constructor predeterminado no se definirá explícitamente. Por lo tanto, la única forma de instanciar nuestra clase ‘Gato’ ahora es usar el constructor que requiere un nombre. Si intenta cambiar el código en main.jspp para instanciar una clase con cero argumentos, obtendrá un error de compilación.