Programación orientada a objetos.
La programación orientada a objetos es una cualidad que tienen lo lenguajes de programación de alto nivel en el cual los programas pueden compartir métodos, funciones y objetos protegiendo al propio objeto y pudiendose crear nuevos objetos a raíz del mismo con las funciones del propio objeto e incluso con nuevas funciones y atributos.
Existen tres características principales de la programación orientada a objetos: la herencia, el polimosfismo y la abstración.
En la Clase 11 del curso de VB.NET vimos como utilizar una clase y los tipos de modificadores en VB.NET para instanciar objetos En esta clase ahondaremos en esos conceptos de las clases que forma la programación orientada a objetos.
Para nuestro estudio vamos a suponer una clase genérica llamada vehículo.
Un objeto llamado coche1 puede ser instancia de la clase principal vehículo que tiene cuatro ruedas y dos puertas. Coche1 puede tener una rueda más y una propiedad color. A su vez otras dos instancias coche2 y coche3 pueden tener las mismas propiedades de la clase vehículo (cuatro ruedas y dos puertas), y tener propiedades específicas como tamaño o potencia en caballos.
Entonces se puede hablar que las clases son estructuras en las que se definen propiedades y métodos que pueden ser compartidos con otros objetos. Por así decirlo, las clases son el esqueleto de los objetos y las aplicaciones.
Recuerda cuales son las tres características de un lenguaje orientado a objetos:
ENCAPSULACIÓN.Es la cualidad de unificar los datos y la forma de manipularlos, de esta forma podemos ocultar el funcionamiento de una clase y exponer solo los datos que manipula (mediante propiedades), así como proveer de medios para poder manipular dichos datos (mediante métodos). De esta forma solo exponemos al mundo exterior la información y la forma de manipularla, ocultando los detalles usados para manejar esos datos y, lo que es más importante, evitando que nadie manipule de una forma no controlada dicha información.
HERENCIA.Es la cualidad de poder crear nuevas clases (o tipos) basadas en otras clases, de forma que la nueva clase obtenga todas las características de la clase que ha heredado, tanto los datos que contiene como la forma de manipularlos, pudiendo añadir nuevas características e incluso cambiar el comportamiento de algunas de las incluidas en la clase base, (siempre que así se haya previsto). Mediante la herencia podemos crear de forma fácil una jerarquía de clases que comparten un mismo comportamiento básico pero que cada nueva generación puede tener (y de hecho tiene) un nuevo comportamiento.
POLIMORFISMO.Es la cualidad de implementar de forma particular algunas de las características que tienen las clases, de forma que cuando necesitemos usarlas no nos preocupe la implementación interna que cada una tenga, lo que realmente nos interesa o nos debe importar es que podemos usar esas características e incluso podamos acceder a ellas de forma anónima.
Estructuras
Los términos clase y objeto se usan a veces indistintamente pero, en realidad, las clases describen el tipo de los objetos, mientras que los objetos son instancias de clases que se pueden usar. Así, la acción de crear un objeto se denomina creación de instancias. Con la analogía anterior, una clase es un vehículo genérico y un objeto es un coche construido a partir de ese vehículo genérico.
Para definir la clase utilizamos la palabra clave class
seguida de un identificador.
Una clase solo se puede utilizar a nivel de módulo o en un espacio de nombres. Esto significa que el contexto de la declaración de una clase debe ser un archivo de código fuente, un espacio de nombres, una clase, una estructura, un módulo o una interfaz y no puede ser un procedimiento o un bloque.
Las clases tienen acceso de forma predeterminada a Friend . Los niveles de acceso se pueden ajustar con los modificadores de acceso.
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, Public se puede tener acceso a una variable de una estructura privada desde dentro de la clase que contiene la estructura, pero no desde fuera de esa clase.
Existe un sexto modificador como es el private protected que hace que solo se pueda tener acceso al elemento desde la propia clase así como las clases derivadas que se encuentren en el mismo ensamblado que la clase contenedora.
En la siguiente tabla puedes ver las características resumidas.
MODIFICADORES | NIVEL DE ACCESO | ELEMENTOS PERMITIDOS | USO MODIFICADOR |
---|---|---|---|
Public | Sin restricción. Cualquier código que pueda ver un elemento público puede acceder a él. | Interfaces, Módulos, Clases, Estructuras, Miembros de estructura, Procedimientos, Propiedades, Variables de miembro, Constantes, Enumeraciones, Eventos, Declaraciones, externas, Delegados | Archivo de origen, Espacio de nombres, Interfaz, Módulo, Clase, Estructura |
Protected | Derivación: El código de la clase que declara un elemento protegido, o una clase derivada de él, puede tener acceso al elemento. | Interfaces, Módulos, Clases, Estructuras, Miembros de estructura, Procedimientos, Propiedades, Variables de miembro, Constantes, Enumeraciones, Eventos, Declaraciones, externas, Delegados | Clase |
Friend | Ensamblado: El código del ensamblado que declara un elemento Friend puede tener acceso a él. | Interfaces, Módulos, Clases, Estructuras, Miembros de estructura, Procedimientos, Propiedades, Variables de miembro, Constantes, Enumeraciones, Eventos, Declaraciones, externas, Delegados | Archivo de origen, Espacio de nombres, Interfaz, Módulo, Clase, Estructura |
Protected friend | Unión de Protected y Friend : El código de la misma clase o del mismo ensamblado que un elemento Friend protegido, o dentro de cualquier clase derivada de la clase del elemento, puede tener acceso a él. | Interfaces, Módulos, Clases, Estructuras, Miembros de estructura, Procedimientos, Propiedades, Variables de miembro, Constantes, Enumeraciones, Eventos, Declaraciones, externas, Delegados | Clase. |
Privated | Contexto de declaración: El código del tipo que declara un elemento privado, incluido el código dentro de los tipos contenidos, puede tener acceso al elemento. | Interfaces, Módulos, Clases, Estructuras, Miembros de estructura, Procedimientos, Propiedades, Variables de miembro, Constantes, Enumeraciones, Eventos, Declaraciones, externas, Delegados | Módulo, clase, estructura. |
Privated protected | Código de la clase que declara un elemento protegido privado o código en una clase derivada que se encuentra en el mismo ensamblado que la clase Base. | Interfaces, Módulos, Clases, Estructuras, Miembros de estructura, Procedimientos, Propiedades, Variables de miembro, Constantes, Enumeraciones, Eventos, Declaraciones, externas, Delegados | Clase. |
Miembros de una clase.Cada clase puede tener distintos miembros de clase, entre los que se incluyen las propiedades que describen los datos de clase, los métodos que definen el comportamiento de la clase y los eventos que proporcionan comunicación entre distintos objetos y clases.
Como puedes ver en la imagen anterior una clase Vehículo tiene una serie de métodos y miembros de la propia clase. Puedes ver que son de ámbito de clase, por lo que la clase podrá acceder a ellos. Tenemos un método privado llamado Plantilla que será la encargada de escribir los elementos básicos a nuestro objeto. Y además tenemos una serie de métodos como el de Aumentarvelocidad() y Disminuirvelocidad(), que aumentarán o disminuirán la velocidad en una unidad.
Juguemos con las clases.
Si todavía no lo has hecho, abre un nuevo proyecto y ponle el nombre que quieras. Vamos a ver como funcionan las clase y sus miembros según se modificador.
Ya que tenemos nuestra clase Vehiculo creada, y tres métodos principales, vamos a llamarlos desde el formulario. Para ello tienes que hacer que, desde la clase que vas a llamar a la otra clase, crear la instancia de dicha clase, es decir un objeto de la clase.
dim coche as new Vehiculo
Con la instrucción anterior instanciamos un nuevo objeto de la clase Vehiculo, y como lo hacemos dentro de la clase Form1, dentro de dicha clase podremos usar los métodos y las propiedades públicas de la clase Vehiculo. Además podemos usar las propiedades de la clase directamente en los objetos de la clase Form1.
Así podemos poner un valor directamente en el control Label1 del Form1. Cuando se ejecute aparecerá el valor actual que es 0 y pulsando los botones + y - podremos hacer que aumente o disminuya el valor de la velocidad.
Y obviamente al pulsar los botones de + o -, aumenta la velocidad en una unidad o se disminuye.
Ya hemos utilizado los métodos de la clase vehiculo que recuerdan que son privados. Pero hemos accedidos a ellos desde nuestra clase formulario gracias a la instancia desde el formulario principal.
¿Qué pasa con el método Plantilla?.Curiosamente el método plantilla también es un método privado y tiene 4 propiedades como puedes ver en la imagen.
Si intentamos llamar a las propiedades de éste método no vamos a poder usarlas porque se han creado dentro del método y por defecto son privadas. Es decir, las variables declaradas dentro de un método son privadas, aunque el método sea público.
Si queremos utilizarlas como en el caso de agregar un tercer botón para crear el objeto coche, tendremos que hacer lo mismo que con velocidadMax, es decir, declararla pública en la clase dentro de su constructor y no dentro de un método. Así si sacamos la variable ruedas del método y la declaramos fuera de cualquier método se podrá acceder a ella siempre que el modificador permita el acceso a dicha variable.
Como te puedes dar cuenta ahora si podemos acceder a la propiedad ruedas del método Plantilla el cual tiene un valor de 4 y desde el Button3 le cambiamos el valor a 2 para mostrar que se tiene acceso.
Modificando los permisos.Fijate que si cambiamos el modificador de la propiedad ruedas, el programa no nos dejará usar dicha propiedad.
Recuerda que los modificadores de acceso pueden ser a nivel de la clase o a nivel del ensamblado y que private es a nivel de clase (igual que si fuera una variable interna de los procesos o métodos).
GET y SET.
Las propiedades tienen procedimientos get y set, que proporcionan un mayor control sobre la forma en que se establecen o devuelven los valores. Visual Basic permite crear un campo privado para almacenar el valor de propiedad, o bien usar las denominadas propiedades implementadas automáticamente property, que crean este campo automáticamente en segundo plano y proporcionan la lógica básica para los procedimientos de propiedad. Para definir una propiedad implementada automáticamente necesitamos usar la palabra clave property
, así creamos un nuevo Porperty de la siguiente forma:
Como puedes observar, dentro de la propiedad he utilizado el Get y el Set. Además fijate que he sacado la variable que voy a utilizar que será el color del vehículo.
En la mayoría de los lenguajes de programación se utiliza el GET para devolver un valor asignado en el programa. Por eso la claúsula get siempre va unida a una instrucción return
que implica que el valor de dicha variable sera devuelta.
Get no tiene en cuenta el valor devuelto ni el tipo de dato que devuelve, eso lo tiene en cuenta el CLR de VB.NET, por lo que tienes que hacer que el dato a devolver coincida con la salida que necesitas tratar.
Así por ejemplo en la siguiente imagen puedes ver que creo una entrada de datos y que asigno a la variable de la propiedad colores(). Y el resultado lo plasmo en el MsgBox.
En un primer instante cuando se ejecuta el programa, el valor que devuelve el bloque property viene dado por el método get, que a su vez coje el valor público de la variable color.
En el momento que yo termine de escribir el nuevo valor, el bloque property devolverá el SET con el nuevo valor añadido en el InputBox.
Con lo que esta opción es mejor que otras opciones a la hora de manejar los valores del programa. Eso si, tendrás que tener cuidado con los tratamientos de los tipos de datos ya que aunque GET y SET no manejan los tipos de datos, si se quiere manipular esos tipos desde el property, se debería de declarar el property con ese tipo de dato:
Además el uso de los property con GET y SET mejora el rendimiento del programa y la manipulación de memoria RAM al compactar la información en sectores localizados sin duplicar la variable.