La Programación Orientada a Objetos OOP permite al desarrollador modelar objetos del mundo real en el código mediante el uso de clases. Si creamos una aplicación para un cajero automático. Necesitará tratar con objetos tales como clientes, cuentas, depósitos, retiros, saldos, etc. Es mucho más fácil escribir código para modelar estos objetos creando una representación de dichos objetos en el código y luego asignar a estos objetos de código las mismas características y funcionalidad que la que tienen los objetos del mundo real. Una clase es un archivo que contiene el código necesario para modelar los objetos del mundo real. Una clase es como una plantilla de objetos.
La razón para hacer referencia a estos tipos de objeto como tipos por referencia es que la variable declarada para el tipo mantiene sólo una referencia al objeto real.
En el código .NET, se utilizan dos secciones lógicas distintas: de memoria y del ordenador. Se les llama pila (stack) y montón (heap). La pila es un área de memoria reservada por el sistema operativo para la ejecución. En la pila es donde .NET almacena tipos de datos simples en una cantidad relativamente pequeña de memoria utilizada para la ejecución del código. La mayoría de los tipos de datos simples serán creados y destruidos bastante rápido a medida que se ejecuta la aplicación, y por lo tanto la pila se mantendrá limpia durante la ejecución del código. También es la razón por la que recibiremos excepciones de memoria insuficiente si ponemos un bucle infinito que se ejecuta y que almacena valores en la pila.
El montón es un área de memoria mucho más grande que .NET Framework utiliza para almacenar los objetos que crea nuestro código basado en clases. Un objeto creado a partir de una clase puede requerir grandes cantidades de memoria en función del tamaño de la clase. Las clases contienen tipos de datos simples para mantener los valores pertenecientes a las características de los objetos que está modelando. También contienen métodos que proporcionan la funcionalidad que muestra el objeto.
.NET Framework utiliza la referencia hacia un objeto, que es su dirección de memoria. De este modo, si el código requiere copiar o asignar el objeto a otra variable, la memoria se conserva porque el compilador copia solo la dirección de memoria donde se encuentra almacenado y no el objeto en sí. Las clases se crean con una sintaxis específica como se muestra aquí:
{
// campos
// propiedades
// métodos
// eventos
// delegados
// clases anidadas
}
El ejemplo anterior no dicta el orden de los componentes de la clase, sino que simplemente enumera los elementos que puede contener una clase. Además, los artículos enumerados no son obligatorios. Si estuviéramos modelando un coche, los campos podrían consistir del modelo, marca, color, año, número de puertas, etc. Los campos también se conocen comúnmente como Miembros, miembros de datos y campos de datos.
Las propiedades están directamente relacionadas con los campos. Las propiedades se utilizan para permitir el acceso controlado a los campos. en nuestra clase.
Los métodos se utilizan para proporcionar funcionalidad a los objetos. Los objetos del mundo real tienen funcionalidad. Siguiendo la analogía del coche, un coche encender o apagar el motor y puede acelerar, o frenar, detenerse, etc. Estos son ejemplos de métodos.
Los eventos también son funcionalidades en el código, pero de una manera diferente. Son cosas que suceden como resultado de alguna influencia exterior. Por ejemplo, si un sensor en un automóvil detecta un problema, se eleva un evento y el ordenador del automóvil "escucha" el evento que se está activando con lo que genera una advertencia. Los eventos son un mecanismo por el cual los objetos notifican a otros objetos cuando sucede algo. El objeto que provocó el evento es el editor de eventos (event publisher) y el objeto que recibe el evento es el suscriptor del evento (event subscriber ).
Un delegado es "un tipo que hace referencia a un método". Si pensamos en un delegado en términos de un escenario político. Por ejemplo, un político delegado es alguien que ha sido elegido para representar a una o más personas. En C#, un delegado se puede asociar con cualquier método que tenga una firma similar (tipos de argumento).
Modificadores
Los modificadores se utilizan en la declaración de tipos y los datos miembro de nuestros tipos por referencia. En la siguiente tabla enumeraremos los modificadores disponibles en C# junto con una descripción de lo que hacen.
Modificador
|
Descripción
|
public
|
Modificador de acceso que declara la
accesibilidad del tipo al que está asignado. Este es el nivel más permisivo.
Se permite el acceso fuera del cuerpo de la clase o estructura. Los tipos por
referencia y valor pueden ser declarados públicos. Los métodos también pueden
ser declarados públicos.
|
private
|
Declara la accesibilidad del tipo que se le
asigna. Es el menos permisivo, permite el acceso solo dentro del cuerpo de la
clase o estructura Los tipos de referencia y valor pueden ser declarados
privados. Los métodos también pueden ser declarados privados.
|
internal
|
Modificador de acceso que declara la
accesibilidad al tipo al que está asignado.
Permite el acceso solo dentro de archivos en el mismo ensamblaje .NET.
|
protected
|
Modificador de acceso para miembros. Los
miembros declarados como protected son
accesibles solamente desde dentro de la clase y en las clases derivadas.
|
abstract
|
Utilizado en clases, indica que la clase no puede ser
instanciada pero que sirve como clase base para otras clases en una jerarquía
de herencia.
|
async
|
Configura el método o la expresión lambda a
la que se aplica como método asíncrono.
Permite a los métodos llamar a procesos de larga duración sin bloquear el código de llamada. |
Aplicado a un campo, indica que el campo no
puede modificarse. Las constantes deben inicializarse en el momento de su
creación.
|
|
event
|
Se utiliza para declarar eventos en el código.
|
extern
|
Se utiliza para indicar que el método se ha
declarado e implementado externamente.
Se puede usar esto con archivos
DLL importados o conjuntos externos.
|
new
|
Cuando se utiliza con los miembros de una
clase, este modificador oculta los miembros heredados de los miembros de la
clase base. Es necesario hacer esto si hemos heredado un miembro de una clase
base pero nuestra clase derivada necesita utilizar nuestra propia versión de
ese miembro.
|
override
|
Se utiliza cuando heredamos la funcionalidad
de una clase base que queremos cambiar.
|
partial
|
Los archivos de clase pueden existir en
varios archivos en el mismo ensamblaje. Este modificador dice el compilador
que la clase existe en otro archivo o archivos en el ensamblaje.
|
readonly
|
Los miembros de solo lectura pueden asignarse
solo durante la declaración o en un
constructor de clase. No se permite ningún otro medio para cambiar o asignar
un valor a ese miembro.
|
sealed
|
Se aplica a clases. Las clases selladas no se
pueden heredar.
|
static
|
Cuando se aplica a un miembro de la clase,
significa que pertenece a la clase
solo y no a objetos específicos creados a partir de la clase. .NET
Framework tiene muchos ejemplos de esto, como la clase Math o la clase
String.
|
unsafe
|
C# es código administrado, lo que significa
que las operaciones de memoria se utilizan de forma protegida. El uso de la
palabra unsafe declara un contexto que
no es seguro en términos de gestión de memoria, los punteros de C++ son
ejemplos de operaciones de memoria no segura. Las operaciones para utilizar
punteros en C#, se deben declarar en un contexto no seguro
|
Si creamos una clase y queremos permitir que
el método se sobrescriba en una clase derivada, podemos utilizar la
palabra virtual.
|
|
volatil
|
Cuando
se aplica a un campo, el campo puede ser modificado por componentes aparte de nuestro código, como por ejemplo
el sistema operativo
|
Definiendo campos
Utilizamos campos para almacenar los datos que describen las características de las clases. Los campos se declaran como variables dentro de la clase y pueden ser de cualquier tipo y pasarse por valor o por referencia.
Los campos vienen en dos tipos básicos, como instancia y estáticos, y una clase puede contener un tipo o los dos. Un campo de instancia es el que utilizaremos más a menudo en nuestras clases. Los campos de instancia son aquellos contenidos dentro de cada objeto que se crea desde la definición de la clase. Cada campo de instancia contiene datos específicos para el objeto al que está asignado. Como ejemplo, crearemos una clase simple y luego crearemos dos instancias de la clase, estableciendo diferentes valores para los campos de la clase.
Clase que muestra campos de instancia [clase_estudiante]
// crea una clase llamada
estudiante
class Estudiante
{
public static int
CuentaEstudiantes;
public string Nombre;
public string Apellido;
public string Grado;
}
class
Programa
{
static void Main(string[] args)
{
Estudiante primerEstudiante = new Estudiante();
Estudiante.CuentaEstudiantes++;
Estudiante segundoEstudiante = new Estudiante();
Estudiante.CuentaEstudiantes++;
primerEstudiante.Nombre = "Mariano";
primerEstudiante.Apellido = "González";
primerEstudiante.Grado = "primero";
segundoEstudiante.Nombre = "Timoteo";
segundoEstudiante.Apellido = "Pérez";
segundoEstudiante.Grado = "segundo";
Console.WriteLine(primerEstudiante.Nombre); Console.WriteLine(segundoEstudiante.Nombre); Console.WriteLine(Estudiante.CuentaEstudiantes);
Console.ReadLine();
}
}
Análisis
La primera parte del código crea una clase simple llamada Estudiante. En esta clase, creamos cuatro variables.
Una se declara como una variable estática de tipo int y se llama Cuentaestudiantes. Utilizamos esta variable para hacer un seguimiento de cuántos estudiantes hemos creado. Debido a que es estática, es una variable que se asigna a la clase, no a una instancia. Cada una de las variables restantes son variables de instancia y se asignarán valores en cada objeto (instancia) de esta clase que hemos creado.
Dentro del método principal, hemos creado dos instancias de la clase Estudiante: una llamada primerEstudiante y otra llamada segundo estudiante.
Podemos hacerlo indicando primero el tipo de variable que deseamos utilizar. De la misma manera que creamos los tipos por valor, utilizaremos el nombre del tipo seguido del nombre de la variable.
En este caso, el nombre de la variable es en realidad el nombre de un objeto del tipo de la clase que creamos en el código. La palabra clave new dice al compilador que deseamos crear una nueva instancia del tipo de clase Estudiante. La nueva palabra clave es una instrucción para que el compilador vea la clase Estudiante, identificamos a los miembros y sus tipos de datos, luego reservamos suficiente memoria para almacenar el objeto y todos nuestros requisitos de datos. Después de creamos cada objeto, utilizamos la variable estática en la clase Estudiante y le agregamos uno. Esta La variable solo está disponible en la clase y no en los objetos de instancia, por lo que debemos utilizar el nombre de la Clase Estudiante para acceder a esta variable. Una vez que hemos creado las instancias, les asignamos valores a los miembros. Utilizaremos el nombre de cada instancia para asignar valores a sus miembros. Y aquí es donde está la diferencia entre las variables estáticas y de instancia. Después de las asignaciones, se envían los valores a la consola. En este caso, solo se imprimen los nombres de cada instancia Estudiante para mostrar que los valores son realmente únicos para cada instancia. Podemos llevar un recuento de objetos de la clase Estudiante porque CuentaEstudiantes es una variable de clase estática y no una variable de instancia.
No hay comentarios:
Publicar un comentario