Ronda de bonificación
¡Bienvenido de nuevo a nuestra Introducción a la Programación Orientada a Objetos! Quizás sería más apropiado decir:"¡Bienvenido a la ronda de bonificación de nuestra Introducción a la programación orientada a objetos!". ¡Este artículo y el siguiente son para aquellos de ustedes que quieran aprender un poco más sobre algunos de los fundamentos de la Orientación a Objetos y que disfruten de contenido extra!
Para repasar, si ha seguido algunos de los primeros cinco artículos de esta serie, habrá aprendido bastantes cosas:
- Cómo la abstracción ayuda a simplificar las tareas de programación.
- Los conceptos básicos de clases, métodos y propiedades de la orientación a objetos.
- Los conceptos básicos de trabajar con variables y tipos y manipular esos datos.
- Cómo manejar el control de flujo con
for
ywhile
bucles. - Cómo juntar todo esto para crear un programa simple.
Este artículo y el siguiente tomarán lo que aprendió de esa introducción y le mostrarán más sobre cómo puede usar algunos de los principios de la orientación a objetos (a menudo abreviado OO) para crear un código eficiente y bien organizado. Comenzaremos con un nuevo programa que nos permitirá revisar algunos conceptos básicos y conducir a algunos conceptos nuevos, como constructores y herencia .
De nuevo, estaremos programando en C# usando Visual Studio de Microsoft. Si desea seguirnos (y aún no lo ha hecho), puede encontrar la configuración aquí mismo.
Si sigue la configuración en ese artículo hasta la sección "Debajo del capó", estará justo donde comenzaremos. Lo único que haré diferente a ese artículo es que no usaré el nombre de proyecto predeterminado "ConsoleApplication1". En cambio, llamaré a mi proyecto "PettingZoo" (en una palabra) porque construiremos un zoológico de mascotas como nuestro programa de ejemplo.
Nota:la orientación a objetos está disponible en muchos lenguajes y plataformas, y los conceptos son muy similares. Elegí C# porque es fácil comenzar y todos los recursos que necesita son gratuitos. Es posible que tenga otros idiomas y plataformas que desee usar, y eso también está bien. Estamos aquí para aprender la orientación a objetos, no cualquier lenguaje o implementación en particular.
.
Configuración inicial
Antes de comenzar, verifique que tenga una aplicación de consola creada en Visual Studio. Debería parecerse a la Figura 1.
Figura 1:Configuración inicial del programa PettingZoo
Con esta aplicación de consola disponible en Visual Studio, podemos comenzar a crear nuestra primera clase. En C#, hay varias formas de crear una clase. En algunos lenguajes, como Java, es necesario crear clases de maneras específicas utilizando nombres de archivos y patrones de carpetas específicos, pero a C# solo le importa que digamos que algo es una clase.
Tenga en cuenta que incluso en la aplicación de consola predeterminada, ya tiene una clase llamada Program
. Usando la palabra clave class
seguido del nombre de la clase es cómo se define una clase en C#.
Para nuestro enfoque, crearemos un nuevo archivo de código para albergar nuestras clases. Haga clic con el botón derecho en el nodo PettingZoo en el panel Explorador de soluciones y luego haga clic en Agregar->Clase, como se muestra en la Figura 2.
Figura 2:Agregar una clase con el Explorador de soluciones
En el cuadro de diálogo que se abre, busque el elemento Código, ya sea buscando o navegando, y llame a su archivo de clase de forma similar a Animals.cs, como se muestra en la Figura 3.
Figura 3:Cuadro de diálogo Agregar archivo de clase
Ahora debería obtener un nuevo archivo de clase creado por Visual Studio que contiene algo como esto:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace PettingZoo { class Animals { } }
Tenga en cuenta que, de forma predeterminada, Visual Studio crea un archivo de clase y una definición de clase en función del nombre de archivo que elija. En algunos lenguajes, como Java, esta estructura es un requisito, pero en C# no es tan estricta. Cambiaremos el nombre de la clase en un momento, pero déjalo por ahora.
En el archivo que acaba de crear Visual Studio, notará una serie de using
declaraciones, así como un namespace
bloque de código Estas líneas no son importantes para nuestra clase, pero, en caso de que tenga curiosidad, un espacio de nombres en C# es una forma de organizar los nombres en su proyecto. Puede tener varias clases con el mismo nombre, por ejemplo, organizadas en diferentes espacios de nombres.
Siempre que trabaje dentro de un único espacio de nombres, el direccionamiento de clases es bastante sencillo. Pero si necesita organizar su proyecto en divisiones más complejas, es posible que deba utilizar diferentes espacios de nombres, en cuyo caso using
Las declaraciones le permiten crear accesos directos a esos espacios de nombres.
.
Clases y Objetos
El archivo que ahora tiene contiene una clase prefabricada con un nombre basado en el nombre de archivo que eligió. No vamos a tener un Animals
clase, sin embargo, así que cambiemos eso a otra cosa. En un zoológico de mascotas, necesitamos perros, por supuesto, así que cambie el nombre de la clase de Animals
a Dog
:
class Dog { }
Tenga en cuenta el cambio de Animals
(plural) a Dog
(singular). Crearemos otra clase más tarde llamada Animal
, así que tenga cuidado cuando lea el código que detecte en matices como ese.
Antes de comenzar a agregar contenido a la clase, examinemos la diferencia entre clases y objetos. Recuerde que una clase es la plantilla de cómo deberían ser los objetos. Una analogía simplista y no muy precisa es la de una receta y un pastel.
(Esta sección es una revisión de las clases y los objetos adaptados de la explicación presentada en el artículo vinculado anterior. Si desea omitir este repaso e ir directamente a la programación, ¡salte directamente a la siguiente sección! De lo contrario, ¡disfrute de un poco de pastel!)
La receta le dice cómo hacer un pastel y, por lo tanto, en términos de OO, es una clase . Un pastel es el resultado de la ejecución de la receta y, de nuevo, en términos OO, es un objeto . Otro término que se usa con frecuencia es instancia. , para indicar que el pastel es una instancia de la ejecución de una receta.
Como ocurre con las tartas y las recetas, cada tarta es una tarta única. Lo que le haces a un pastel no afecta a ningún otro pastel. Poner glaseado en una magdalena no significa que todas las magdalenas ahora tengan glaseado. Del mismo modo, si te comes un pastelito, todavía te quedan todos los demás.
Sin embargo, tener una receta y saber que produce un pastel no es suficiente. También necesitas una cocina en la que hornear el pastel. En términos de OO, este es el programa en el que crea el objeto y, en nuestro caso, ese sería el archivo Program.cs principal.
.
Volver al zoológico de mascotas
Usemos nuestra nueva clase para crear un Dog
objeto, así que abra el archivo Program.cs y agregue la siguiente línea dentro del static void main
bloque de código:
Dog myDog = new Dog();
Esta línea creará un nuevo Dog
objeto del Dog
class y guárdelo en myDog variable. Permítanme dividir esta línea en tres partes para poder explicar lo que sucede.
[1]Dog [2]myDog = [3]new Dog();
El primer elemento [1], Dog
, es el tipo de variable que queremos crear. En lenguajes de tipo estático como C# y Java, necesitamos declarar de qué tipo es una variable antes de poder asignarle valores. Los lenguajes que se escriben dinámicamente, como JavaScript o Perl, no requieren esto y ponen la responsabilidad de rastrear qué tipo de datos contiene una variable en el desarrollador.
El segundo elemento [2], myDog , es el nombre de la variable que usamos para acceder al objeto. Este no es necesariamente el nombre del perro que creamos, sino el que usamos para hacer referencia a esta instancia particular de un Dog
clase.
Nota:Para obtener más información sobre variables y tipos de datos como cadenas, consulte nuestro artículo de introducción a la programación sobre variables y tipos.
.
Finalmente, el tercer elemento [3], new Dog()
, nos dice que queremos crear o instanciar –un nuevo objeto basado en el Dog
clase. Tenga en cuenta que hay paréntesis después del nombre de la clase, lo que significa que en realidad es un método . Volveremos a este método, que es un método especial llamado constructor (Profundizaremos en los constructores en el próximo artículo vinculado a continuación).
Con nuestro programa ahora creando un nuevo objeto desde el Dog
clase que almacena en myDog variable, podemos comenzar a acceder a las propiedades y el método de nuestro objeto. ¡Excepto, por supuesto, que nuestra clase está completamente vacía y sin contenido! Arreglemos eso.
.
Propiedades y Métodos
Volvamos a nuestro archivo Animals.cs, donde nuestro Dog
la clase tiene un nombre pero nada más. Sin embargo, todo lo que coloquemos dentro de este bloque de código se convertirá en parte de la definición de la clase. Recuerde, las clases tienen propiedades y métodos que definen, respectivamente, qué es un objeto y qué puede hacer.
Vamos a crear una propiedad y un método, y luego discutiremos lo que hace cada uno. Dentro de los corchetes de su bloque de código, {}
, agregue las siguientes dos líneas:
string Name; void Speak() { Console.WriteLine("Woof"); }
La primera línea (string Name;
) es una propiedad o campo . En la orientación a objetos, las propiedades definen qué es algo. En nuestro caso, queremos que nuestro perro tenga un nombre, por lo que hemos creado una propiedad de cadena para contener el nombre del perro.
Recuerda que la orientación a objetos busca crear representaciones programáticas de objetos reales. Por supuesto, un nombre por sí solo no hace un perro, pero OO no busca duplicar todas las propiedades de cada objeto, solo aquellas que necesitamos. Agregaremos más propiedades más adelante.
La segunda línea es un método definición (o firma del método ) y es un poco más complejo, así que, como antes, déjame dividirlo un poco y mostrarte lo que hace cada elemento.
[1]void [2]Speak() [3]{ Console.WriteLine("Woof"); }
Elemento [1], void
, es el retorno tipo del método, o el tipo de salida que producirá el método cuando se ejecute. En lenguajes de tipos estáticos como C# y Java, además de declarar tipos de variables, siempre debemos declarar qué tipo de datos devolvemos de los métodos. Los lenguajes tipeados dinámicamente dejan la responsabilidad de determinar lo que sale de un método al desarrollador.
En nuestro caso, al menos inicialmente, solo queremos que el perro diga “Guau” cuando le pedimos que hable, por lo que no necesitamos devolver nada. Esto cambiará más adelante, cuando cubramos la herencia en el próximo artículo.
Sin embargo, aunque no queremos devolver ningún valor específico, aún debemos ser explícitos al respecto en el programa. Para hacerlo, podemos declarar que el método devuelve un vacío valor, que en C# y lenguajes similares significa que no estamos devolviendo nada.
Elemento [2], Speak()
, es el nombre del método y es lo que usamos para llamar o ejecutar el método. Tenga en cuenta que los métodos, como las propiedades, pertenecen al objeto.
Elemento [3], el bloque de código , es el código que ejecutará el programa cuando llamemos al método. También puede ver este tipo de bloque de código también llamado cuerpo del método . En este momento, dentro de este bloque de código, solo le diremos a la consola que escriba una línea que contenga "Guau".
.
Hacer público su método
Ahora que tenemos un método, podemos llamarlo o ejecutarlo desde nuestro programa y hacer que el perro ladre. Sin embargo, hay un problema que me brinda una gran oportunidad para revisar otro de los conceptos clave de la orientación a objetos.
Normalmente, para acceder a las propiedades y métodos de un objeto, primero escribiría el nombre de la variable que contiene su objeto y luego el nombre de su propiedad o método. Por ejemplo, para obtener el valor de Name
propiedad de cadena, podría escribir:
string dogName = myDog.Name;
Para ejecutar el método Speak(), podrías escribir:
myDog.Speak();
Sin embargo, si hace esto en Program.cs, recibirá un mensaje de error como el que se muestra en la Figura 4.
Figura 4:Error de nivel de protección
El error que indica "'PettingZoo.Dog.Speak()' es inaccesible debido a su nivel de protección" ocurre debido a un concepto clave en OO llamado abstracción .
En resumen, la abstracción elimina los detalles de cómo funciona algo cuando no necesitamos saber esos detalles. En nuestro programa, solo necesitamos saber que el perro puede hablar, pero realmente no nos importa cómo lo hace.
En cambio, la abstracción permite que el diseñador de la clase cree puntos de acceso a la clase a través de los cuales puede trabajar con los objetos. Muchos idiomas permiten este acceso a través de modificadores de acceso .
C#, de forma predeterminada, oculta propiedades y métodos desde fuera de la clase. Sin embargo, la política sobre este tipo de separación difiere en otros idiomas, y algunos lenguajes como JavaScript ni siquiera ofrecen este nivel de protección.
Sin embargo, el principio sigue siendo que haces público lo que quieres que todos usen y ocultas el resto. La parte de hacer público, al menos en C#, simplemente significa agregar la palabra clave public
delante de las propiedades y métodos a los que desea que alguien acceda. Entonces, si actualizas el Dog
clase para agregar public
delante del void Speak()
línea en Animals.cs, los garabatos rojos desaparecen en Program.cs, como se muestra en la Figura 5.
Figura 5:Declaración de método público
Como beneficio adicional, cuando haga público su método, Visual Studio agregará el método a las opciones disponibles a través del sistema de autocompletado de IntelliSense. Cuando escribes myDog
y presiona el punto, obtiene una lista de todas las propiedades y métodos públicos de ese objeto, como se muestra en la Figura 6.
Figura 6:Visual Studio Intellisense Autocompletar con nuestro nuevo método público
Otros editores de código tienen sistemas de autocompletar similares. Estos autocompletados son uno de los principales beneficios de estos editores para los programadores:¡aprenderás a amar estas funciones a medida que evolucionas como programador!
.
Ahora que hemos corregido todos los errores, deberíamos poder ejecutar nuestro programa y ver que el perro ladra. Puede colocar un punto de interrupción en su Program.cs haciendo clic en el margen izquierdo o colocando el cursor en el corchete después de myDog.Speak()
y presionando F9. Luego, presione F5 para ejecutar el programa. Debería ver aparecer la consola y debería aparecer el resultado de los ladridos de su perro, como se muestra en la Figura 7.
Figura 7:¡Nuestro perro habla!
Por supuesto, ahora podemos crear una camada de perros creando múltiples variables e instanciando objetos en ellas. Puede intentar algo como la Figura 8, por ejemplo:
Figura 8:Dos perros hablando
¿Tienes un resultado similar? Genial, date una palmadita en la espalda, pero solo una vez, porque todavía tenemos más trabajo por hacer. Después de todo, hemos estado prometiendo que la orientación a objetos nos permite crear objetos únicos, y todo lo que hemos hecho es crear dos "perros" idénticos. A continuación, le mostraremos cómo usar constructores para crear objetos independientes y únicos.
.
.