Clases y librerías. Primera parte

Concepto de clase.

Una clase es un objeto que deriva de una clase general de .NET framework llamada Object. Esta clase básica tiene una serie de métodos y propiedades (atributos), comunes a todas las clases creadas con cualquier lenguaje usado en .NET Framework. Y como Visual Basic.NET se basa en .NET Framework, este lenguaje de programación se basa en la clase Object. Para entender como de una clase se crean otras muchas, nos remontaremos a la programación orientada a objetos (POO).

NOTA: Puedes ampliar conceptos de clase desde el curso de C#VSJava pinchando Aqui

Programación orientada a objetos.
VB.NET a diferencia de lo que ocurría en las versiones anteriores de Visual Basic, es un lenguaje orientado a objetos. Por ello se caracteriza por:

● Ser encapsulado.
● Tener la capacidad de heredar.
● Polimorfismo.

La encapsulación significa que toda la información que una clase u objeto deba de tratar se mantenga oculta al programador y al resto de usuarios. El objeto en cuestión, solo facilitará las propiedades y métodos del mismo para que el programador o usuario puedan modificar las características del objeto.

La herencia es la habilidad de crear nuevas clases basadas en otras clases. La nueva clase heredará todos los métodos, propiedades y eventos de la anterior clase de la que proviene. Además tiene la capacidad de añadir nuevos eventos de la que se ha heredado al provenir esta otra de la clase general Object.

Polimorfismo significa que puedan existir métodos y propiedades con el mismo nombre en diferentes clases, es decir que adaptará el código para diferentes clases sin tener que crear nuevos métodos para dichas clases.

Crear nueva clase.

Crear una clase nueva implica instanciar un objeto en la estructura de trabajo de VB.NET. Todos los objetos (formularios, controles, cajas, etc., etc.), derivan de la clase Object. Por lo tanto para crear una nueva clase a partir de Object, hay que instanciar dicha clase. Además, para instanciar la clase necesitamos crear un nuevo objeto que derive de la clase que queremos derivar mediante la instrucción new.

Por ejemplo vamos a crear un nuevo objeto formulario.

Dim Form2 as New Form

Esta sentencia crea un nuevo objeto de formulario, pero no lo inicializa ni lo usa, solo lo crea y guarda en memoria del ordenador. Ahora hay que definir las propiedades y métodos de esa clase, inicializarla y ajustarla. Eso es lo que hace el CLR cuando inicio un nuevo proyecto de VB.NET ya que crea las clases que necesitas en un nuevo archivo llamado NOMBREPROYECTO.Designer.vb del proyecto y las inicializa de acuerdo las vayas escribiendo dentro del proyecto. Así que cuando insertas, por ejemplo un botón en tu proyecto, en el archivo se crean las instrucciones para crearlo, llamando a la clase, y después configurándola mediante algunas propiedades y métodos.

código que crea y utiliza los controles automaticamente por el CLR

Para que veas mejor el proceso, vamos a crear un nuevo proyecto de Windows Form. Ponle el nombre de clases_y_objetos y pulsa Aceptar. Al abrise el formulario, en la pestaña de codigo puedes ver la clase principal Form1 y un subproceso con un evento de carga llamado Form1_Load.

clase principal del proyecto

Observa como el método Form1_Load, pertenece a la clase principal de Form1.

En Visual Basic.NET se va a priorizar el evento Load del formulario y se cargará el contenido dentro del mismo proceso al igual que en C# se carga el contenido del método contenido en Public Static void main(String[] args){}; pero eso no implica que dicho método sea necesariamente el que se ejecute siempre.

En este curso si vamos a utilizar el evento Load del formulario para ejecutar nuestro código, pero has de saber que no siempre será así.

Continuando con el programa, podeis crear una nueva clase llamada saludar siempre que esté dentro del formulario. Esta clase será una clase derivada de la clase principal Form1 y estará contenida dentro del proyecto. Y dentro de esta clase (como su padre es la clase Form1), puedes llamar a todos los objetos que utiliza el padre. Por lo tanto, crearemos un proceso de saludo en el que contendrá un MsgBox.

Clase secundaria de la clase principal

Esta clase Saludar es una clase hija de la clase Form1, es decir hereda directamente de la clase padre todos los objetos, métodos y atributos que puede manejar el padre (y que a su vez hereda de Objetc); por lo que la clase Saludar, tiene acceso a la clase Object indirectamente. Pero un detalle importante es que la clase saludar, es una clase derivada de la clase Form1.

Si ejecutamos la aplicación no obtendremos ningún mensaje y nos mostrará el formulario vacio, ya que como dije anteriormente, para que podamos utilizar un objeto de una clase, hay que instanciarlo siempre desde la parte en la que la vamos a utilizar y después usarlo.

instanciar y usar el nuevo objeto de la clase saludar()

En la primera línea del proceso Load, creo un nuevo objeto del tipo saludar() llamado saluda. Y en la línea siguiente utilizo el método de la clase saludar llamado saludo en la cual está el MsgBox que me mostrará un mensaje.

Esta forma de proceder es la evolución del lenguaje a una funcionalidad orientada a objetos, en la cual, como has podido ver, hemos utilizado un objeto creado en una clase diferente del mismo documento. Mas tarde volveremos a este concepto.

Modificadores.

En esta capítulo estamos viendo como crear una clase hija de una clase principal. Dicha clase hija tendrá los metodos y propiedades de la clase padre, y la clase padre podrá acceder a todos los métodos de la clase hija. Pero existen situaciones en las que no se pueden acceder a métodos o atributos de las clases hijas o padres. Y eso depende de los modificadores de acceso.

El nivel de acceso de un elemento declarado es la extensión de la capacidad de obtener acceso a él, es decir, qué código tiene permiso para leerlo o escribir en él. Esto no solo se determina en la forma en que se declara el elemento en sí, sino también en el nivel de acceso del contenedor del elemento. El código que no puede tener acceso a un elemento contenedor no puede tener acceso a ninguno de sus elementos contenidos, incluso a los declarados como Public. Por ejemplo, se puede tener acceso a una variable de Public en una estructura de Private desde dentro de la clase que contiene la estructura, pero no desde fuera de esa clase.

Existen 5 tipos principales de modificadores:

Public.
La palabra clave Public de la instrucción de declaración especifica que se puede tener acceso al elemento desde el código en cualquier lugar del mismo proyecto, desde otros proyectos que hagan referencia al proyecto y desde cualquier ensamblado compilado a partir del proyecto. En nuestro ejercicio, la clase principal Form1 es pública.

Protected.
La palabra clave Protected de la instrucción de declaración especifica que solo se puede tener acceso al elemento desde dentro de la misma clase o desde una clase derivada de esta clase. En el código siguiente se muestra una declaración de Protected en la clase saludar. Eso permite que desde Form1 se pueda tener acceso al método saludo de la misma forma que el con el modificador public.

Modificador protected tiene rango a la clase principal

Private.
La palabra clave Private de la instrucción de declaración especifica que solo se puede tener acceso al elemento desde dentro del mismo módulo, clase o estructura.

Además existen otros modificadores como friend y friend protected.

Ámbito de una clase y sus métodos.

Tanto a las clases como a sus miembros (subprocesos, métodos, propiedades, etc.), se les puede añadir modificadores de acceso para que otros elementos del programa tengan o no acceso a sus miembros. Pero claro, a los miembros de las clases no se podrá acceder si no se declara de manera pública. Así por ejemplo, si el método saludo de la clase saludar lo declaro como protected, ya no se tendrá acceso el objeto instanciado en el subproceso de Form1_Load de la clase padre (Imagina ambas procesos saludo y Form1_load como si fueran hermanastros).

Protected y privado no permite el acceso a miembros externos

Por lo que se puede decir que aunque esté en el mismo namespace, los modificadores de private y protected no permiten el acceso a los miembros de una clase cuando algún subproceso se ha declarado con esos modificadores. Es decir, un subproceso privado de una clase no se dejará llamar por otro subproceso de otra clase, aunque esté en el mismo paquete. solo existirá un par de excepciones que será cuando el método sea declarado como Friend o Protected Friend en cuyo caso si tendrán accesso otros métodos de otras clases a dichos miembros.

Los modificadores Friend permiten acceder a los miembros de las clases entre sí

Con el modificador Public no hay ningún problema tanto desde el mismo namespace como fuera de él.

Por defecto, si no se declara modificador de acceso, éste será Public.

A las clases les ocurre lo mismo que a sus miembros, aunque la visibilidad y acceso de las clases es más generalizado de acuerdo a su posición respecto al paquete o la clase principal. En el programa, la clase saludar es pública, por lo que hay problema. Pero si fuera privada, tampoco habría problema de acceso a los miembros de la clase (publicos o amigables), ya que esta clase saludar está dentro de la clase principal y dentro del paquete.

clases privadas se pueden acceder a sus miembros cuando están en la mismo paquete.

Si sacaramos la clase saludo de la clase Form1, el CLR nos devolvería un error, porque las clases derivadas tienen que estar dentro de un mismo tipo.

private impide llamar a la clase

La única forma de poder acceder a dicha clase (que ya no es hija de Form1), es declararla Public o Friend, tal como indica el CLR.

En proximas clases ampliaremos conceptos sobre las clases, sus modificadores de acceso y sus miembros. En la practica vamos a ver las librerías externas y como acceder a ellas.