C# Clases
En C#, una clase es un bloque de código que sirve como un plano o plantilla para crear objetos. Las clases permiten definir propiedades (datos) y métodos (funcionalidades) que tienen comportamientos asociados. Los objetos son instancias de una clase y se crean a partir de la definición de la clase. Las clases son una parte fundamental de la programación orientada a objetos (POO) y ayudan a organizar y estructurar el código de manera más eficiente.
Definición de una Clase
En este ejemplo, hemos creado una clase llamada Persona
con dos propiedades (Nombre
y Edad
), un constructor que inicializa estas propiedades y un método Saludar
que muestra un saludo en la consola.
En otra parte del codigo, lo que podemos hacer es crear una instancia de esta clase. Este momento es donde se construye este objeto del cual la clase es un “template” o “plantilla”.
Este programa crea dos objetos Persona
y llama al método Saludar
de cada uno, lo que imprimirá mensajes personalizados en la consola.
💡 El hecho de que se pueda enviar el string nombre y edad entre paréntesis es la misma lógica que cuando enviamos atributos a traves de un método. Pero en vez de definir un método definimos un constructor. El constructor tiene que tener el se define como
public NOMBRE_DE_LA_CLASE
, en este caso,public Persona(){}
Constructores
Puedes tener varios constructores en una clase de C# para permitir diferentes combinaciones de parámetros, incluyendo parámetros opcionales. Esto se llama "sobrecarga de constructores". Aquí te mostraré cómo hacerlo, incluyendo ejemplos de parámetros opcionales.
En este ejemplo, hemos definido tres constructores diferentes para la clase Producto
. Uno acepta todos los parámetros, otro acepta solo nombre y precio, y el último no acepta ningún parámetro y establece valores predeterminados.
Parámetros
Puedes utilizar parámetros opcionales (al igual que en los métodos) para permitir que los usuarios de tu clase proporcionen solo los valores que deseen al crear un objeto. Aquí hay un ejemplo que utiliza parámetros opcionales:
En este ejemplo, hemos definido un constructor para la clase Coche
que acepta parámetros opcionales. Los parámetros marca
, modelo
y año
tienen valores predeterminados, por lo que si no se proporcionan al crear un objeto Coche
, se utilizarán los valores predeterminados.
Estos ejemplos ilustran cómo puedes crear constructores con diferentes combinaciones de parámetros, incluyendo parámetros opcionales, para hacer más flexible la creación de objetos en C#.
Herencia
En este ejemplo, hemos creado una clase Estudiante
que hereda de la clase Persona
y añade una propiedad y un método adicionales.
💡 Como habras podido ver, todas las clases creadas desde Unity (no desde el editor de codigo). Heredan de Monobehavior. Esto es lo que nos permite tener metodos como
Start()
en esta clase.
Clases en Unity
En Unity, puedes utilizar el método AddComponent
para añadir un componente MonoBehavior a un GameObject. Esto te permite adjuntar scripts personalizados a objetos en tiempo de ejecución.
Supongamos que tienes una clase MonoBehavior llamada MiScript
que deseas añadir a un GameObject en tu escena:
Ahora, en otro script o en algún lugar de tu código, puedes utilizar el método AddComponent
para añadir MiScript
a un GameObject específico. Aquí tienes un ejemplo:
Asegúrate de reemplazar "NombreDelObjeto"
con el nombre real del GameObject al que deseas añadir el componente MiScript
. Cuando ejecutes este código en Unity, se añadirá el componente MiScript
al objeto especificado, y podrás acceder a sus métodos y propiedades.
Ten en cuenta que es importante que el GameObject al que deseas añadir el componente ya exista en la escena o se haya instanciado previamente en el juego. Además, asegúrate de que el script desde el que estás llamando a AddComponent
esté asociado a un GameObject en la escena o en algún prefab para que pueda ejecutarse en tiempo de ejecución.
Pero que pasa con los constructores en Unity?
Para pasar argumentos a un constructor de una clase que hereda de MonoBehaviour
en Unity, debes tener en cuenta que Unity no permite la personalización de los constructores de las clases que heredan de MonoBehaviour
. Esto se debe a que Unity controla el ciclo de vida de los objetos y requiere que sus componentes se inicialicen de una manera específica.
Sin embargo, puedes lograr algo similar utilizando métodos públicos personalizados para configurar tu componente después de que se haya agregado a un GameObject. Aquí tienes un ejemplo de cómo hacerlo:
Supongamos que tienes una clase MiScript
que necesita algunos valores en su inicialización. En lugar de pasarlos directamente en el constructor, puedes crear un método personalizado para configurar los valores después de agregar el componente a un GameObject. Aquí está el ejemplo:
Luego, en otro script o en el Inspector de Unity, puedes agregar el componente MiScript
a un GameObject y luego llamar al método Configurar
para establecer los valores deseados:
De esta manera, puedes pasar argumentos a tu "clase" MonoBehavior después de agregarla al GameObject y asegurarte de que Unity administre adecuadamente el ciclo de vida de tus objetos.
Importante: No es lo mismo pasar un
La diferencia principal entre pasar un int
o un string
como parámetro y pasar una clase como parámetro radica en cómo se maneja la información en memoria y la semántica de pasaje de datos en C#.
Pasar un int
o un string
como parámetro:
int
o un string
como parámetro:Cuando pasas un int
o un string
como parámetro a una función, estás pasando una copia de su valor. Estos tipos de datos son tipos de valor en C#, lo que significa que su contenido se almacena directamente en la memoria donde se llama a la función. Cualquier modificación que hagas en estos parámetros dentro de la función no afectará a las variables originales fuera de la función.
Pasar una class
como parámetro:
class
como parámetro:Cuando pasas una instancia de una clase como parámetro a una función, estás pasando una referencia al objeto. Las clases en C# son tipos de referencia, lo que significa que no pasas una copia de los datos del objeto, sino una referencia que apunta a la ubicación en la memoria donde se almacenan los datos del objeto. Esto significa que cualquier modificación que hagas en el objeto dentro de la función afectará al objeto original fuera de la función, ya que ambos apuntan a la misma ubicación en memoria.
En resumen, la diferencia fundamental radica en la semántica de copia (para tipos de valor) vs. referencia (para tipos de referencia). Al pasar una clase como parámetro, se pasa una referencia al objeto real, lo que permite modificar el objeto original dentro de la función. En contraste, cuando se pasan int
o string
, se pasa una copia de su valor y cualquier modificación dentro de la función no afectará a las variables originales fuera de la función.
Quieres saber mas?
Microsoft es quien tiene toda la información actualizada sobre nuestro querido lenguaje C#
Te recomiendo que investigues la siguiente pagina:
Del lado izquierdo tienes un arbol de seleccion, alli encontraras los Types
divididos en Value types y Reference types.
Last updated