Mostrando entradas con la etiqueta clases. Mostrar todas las entradas
Mostrando entradas con la etiqueta clases. Mostrar todas las entradas

sábado, 21 de octubre de 2017

Curso de C#: clases

Clases

Una clase es la plantilla a partir de la cual es posible crear objetos. Todos los objetos de la misma clase comparten la interface (es decir, métodos, campos y propiedades), pero los datos que contiene cada objeto en sus campos y propiedades pueden diferir.
Por su misión específica,  las clases (y las estructuras) se pueden dividir en tres grandes grupos:

Clases que ofrecen un valor

Son aquellas en las que lo principal es el valor que contienen. Por ejemplo, para pagar un artículo de 50 €. Es posible usar un billete de 50 u otro igual, también de 50. O incluso cinco de 10 € Lo importante es pagar los 50 €, pero no los billetes que utilicemos. Los objetos cuyo único interés es su valor son intercambiables, y suelen estar implementados como estructuras (Int32, Int16, Double...).


Curso de  C#: clases

sábado, 10 de mayo de 2014

Visión general de la programación orientada a objetos. (Con Visual Basic .NET)

Pongo a continuación un resumen de los atributos principales del lenguaje Visual Basic .NET así como de  su utilización en programación orientada a Objetos. Este artículo contiene los siguientes puntos:

Definiciones Generales:


Constantes.

Variables static.

Namespaces.

Punto de entrada al programa.

Clases.

Reglas de ámbito de las clases.

Código de clase y código de cliente.

Propiedades de la clase. (Encapsulación).

Propiedades virtuales.

Propiedades de sólo lectura o sólo escritura.

Me y MyClass.

Sobrecarga de Métodos. (Polimorfismo)

Enlaces (Binding) de variables a referencias de objetos.

Herencia.

Reglas de ámbito.

Herencia y sobrecarga de métodos.

MyBase.

Herencia y sobreescritura de métodos.

Herencia y métodos constructores.

Clases selladas no heredables.

Clases abstractas o no instanciables.

Comprobación del tipo de un objeto y Moldeado (Casting).

Miembros compartidos (Shared) de una clase.

Destrucción de Objetos y recolección de basura.

Interfaces.

Estructuras.


Enumeraciones.


Programación orientada a objetos con Visual Basic.NET


martes, 25 de junio de 2013

Escribir un programa orientado a objetos (II)

Esto es una continuación del artículo anterior sobre como Crear un primer programa orientado a objetos sencillo.

En este artículo aprenderemos a


§ Usar una clase en una aplicación.
§ Usar las herramientas de Microsoft Visual Studio .NET  para crear la definición de una clase

Uso la  clase CHospital en una aplicación


Como se ha dicho anteriormente una clase es una plantilla de un objeto. Por ejemplo un coche genérico es una clase, mientras que un coche concreto es un objeto (instancia de la clase).
Para poner los datos en los campos y propiedades, hay que crear una instancia de la clase en la memoria, esta acción se conoce como instanciación. Cuando se crea una instancia, se reserva una sección de memoria para mantener los campos del objeto. Si se crea otra instancia de la clase, se reserva otra sección de la memoria para sus campos.
Por ejemplo podemos tener n instancias de la clase coche y cada una de ellas representará un coche concreto con sus atributos particulares (propiedades) marca, modelo, color, etc.

Vamos a crear dos instancias de la clase
CHospital en el proyecto Hospital, y se mostrarán los datos de cada hospital, así que tendrán que crearse dos instancias por separado  de la clase CHospital. En lugar de crear una interfaz elegante, se escribirá sólo el suficiente código para ver si la clase está trabajando como se esperaba.
  

Driver de Pruebas


La creación de un pequeño programa  para probar una clase se llama Driver. Es una buena idea  probar  la clase un poco con el Driver antes de agregarla a un programa más amplio. Se utiliza el Driver para probar la clase sin la interferencia del resto del código del programa.

Crear una instancia de CHospital


1. En el Explorador de soluciones, hacer doble clic en Form1 para abrirlo en el Windows
Diseñador de formularios. Si Form1 se abre en el editor de código, seleccionar Ver Diseñador.

Crear un entorno visual similar al mostrado a continuación

Escribir un programa orientado a objetos



2. Agregar el siguiente código para el evento
SelectedIndexChanged del combo superior

Private Sub CboHospitales_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CboHospitales.SelectedIndexChanged

        Dim Hospital1_grupo As CHospital
        Hospital1_grupo = New CHospital()

End Sub

3. Agregar el código siguiente para establecer las propiedades  del hospital inmediatamente después del código introducido en el paso 2:

Hospital1_grupo.Telefono = "914567894"
Hospital1_grupo.Direccion = "Recoletos 23"
Hospital1_grupo.NumSalas  = 28

Cuando se crea la instancia de CHospital , sus campos contienen los valores especificados en la definición de clase. Los campos de dirección y teléfono son una cadena vacía, el número de salas es 0. Tener en cuenta que no hay diferencia en el código del cliente si se utiliza un campo o una propiedad.

4. Agregar el código siguiente  para crear otra instancia de la clase
CHospital.

Dim Hospital2_grupo As CHospital = New CHospital()

Hospital2_grupo.Telefono = "912346578".
Hospital2_grupo.Direccion = "Bravo Murillo 324"
Hospital2_grupo.NumSalas = 12

En este caso, se utiliza una sintaxis diferente para declarar e inicializar una variable de la Clase CHospital. Visual Basic  permite la declaración y la inicialización en la misma declaración. La declaración e iniciación en la misma sentencia tiene las siguientes ventajas:

§  Los programadores tienen menos probabilidades de olvidarse de inicializar la  variable.
§  Cuando una clase define un constructor con parámetros, los campos se  pueden
inicializar al mismo tiempo.

Usar una instancia de la Clase CHospital


5. Agregar el código siguiente para mostrar algunos de los textos de los dos libros.

Dim Informe As String

Informe = "Hospital de " & Hospital1_grupo.Direccion & "Con Telefono" & Hospital1_grupo.Telefono & "Tiene" & Hospital1_grupo.NumSalas & "Salas"

MessageBox.Show(Informe)

Informe = "Hospital de " & Hospital2_grupo.Direccion & "Con Telefono" & Hospital2_grupo.Telefono & "Tiene" & Hospital2_grupo.NumSalas & "Salas"

MessageBox.Show(Informe)

En este fragmento de código se puede ver que hay dos instancias independientes de la clase  CHospital. Es posible hacer referencia a estas instancias utilizando las variables Hospital1_grupo  y Hospital2_grupo. El concepto orientado a objetos permite que cada instancia pueda ser referenciada por separado y se conoce como identidad. Esto no significa que haya que crear una variable para cada instancia. La creación de tantas variables es difícil de manejar si se necesitan cientos de instancias de una clase. Identidad significa que se puede hacer referencia a cada instancia por separado cuando sea necesario.

Al crear una instancia
CHospital, los campos de Hospital1_grupo  han cambiado y se ha llamado al método AltaMedicoHos.

 Más tarde se ha  recuperado el valor de la propiedad Direccion. El valor de la dirección se ha mantenido sin cambios después de llamar al método AltaMedicoHos.  El hecho de que el valor se mantuviera sin cambios demuestra el concepto de estado de los objetos, la idea de que los campos  conservan su valores entre llamadas a métodos.

Se puede  comparar la forma en como funciona el método AltaMedicoHos, un método tiene   las declaraciones de las variables. Después de que el método AltaMedicoHos termina, las variables salen de ámbito y se pierden sus valores.

6. Presionamos F5 para ejecutar el código. Al hacer clic en el botón Mostrar página. Los resultados se muestran aquí:

programa orientado a objetos



Al hacer clic en Aceptar y, a los títulos de los libros se muestran en un cuadro de mensaje, como se muestra aquí:

Hacer clic en Aceptar y, a continuación, cerrar la aplicación.
Hemos creado una clase,
CHospital, y dos instancias de la misma.


Cómo usar el visor de Clases


El entorno de programación permite obtener una vista del árbol de la estructura de clases del proyecto, los espacios de nombres y clases. La Vista de clases puede compartir la misma ventana que el Explorador de soluciones. En el menú Ver, hacer clic en Vista de clases para abrir la Vista de clases. La Vista de clases ampliado se muestra a continuación.



visor de clases


El nodo de más alto nivel representa el proyecto, Hospital. El siguiente nivel de nodos representa los espacios de nombres en el proyecto. Un proyecto puede contener varios espacios de nombres, en este caso, sólo hay uno. El espacio de nombres del proyecto consta de tres clases: la clase que hemos creado,
CHospital, otra que crearemos posteriormente CPersona y la clase para el formulario Windows Forms, frmPrincipal. La clase CHospital contiene cuatro campos privados, representados por bloques de color azul con un candado. La clase también contiene las cuatro respectivas propiedades. Representadas por una mano sosteniendo un formulario. Además, la clase contiene un método, AltaMedicoHos con dos parámetros objeto que devuelven un booleano. El método está representado por un bloque de color púrpura.
Todas las clases en Visual Basic son implícitamente un objeto de una clase base


Añadir el método UbicarPaciente  a la clase CHospital


1. Añadir el siguiente código a la clase CHospital:

Esto crea un array de códigos de Sala para el hospital y su propiedad para acceder a él.
Private m_salas() As String

Public Property Sala(ByVal i As Integer) As Integer
        Get
            Return m_salas(i)
        End Get
        Set(ByVal value As Integer)
            m_salas(i) = value
        End Set
    End Property

Public Function UbicarPaciente(ByVal Nom_Paciente As CPersona, ByVal Cod_Sala As CHospital, ByVal i As Integer) As Boolean

        Dim Reg As RDO.rdoResultset
        Dim strSQL As String

        Reg = Nothing

        On Error GoTo Errores_UbicarPaciente
        strSQL = "INSERT INTO dbo.tbPacSal (strId_PAC,strID_SAL) VALUES (" & Nom_Paciente.Codigo & "," & Cod_Sala.Sala(i) & ")"

        glbBaseDatos.Execute(strSQL)
        Reg.Close()

        Return True

Errores_UbicarPaciente:
        Return False
 End Function

Crear el programa Hospital


Ahora es el momento de escribir el código y probar la aplicación completa.

Conectar a la base de datos el combo box para mostrar el campo strNombre de TbHospital


Resumen


Para

Crear una instancia de una clase
Inicializar la variable usando la palabra new

Dim Hospital1 as New CHospital()

Establecer una propiedad de la instancia

Dim Hospital1 as New CHospital()
Hospital1.Salas = 25

Llamar a un método de la clase.

Dim Hospital1 as New CHospital()
Dim Num_Sala As String
Num_Sala = Hospital1.Sala(3)



lunes, 6 de mayo de 2013

Análisis orientado a orientado a objetos (AOO) II

El proceso de AOO


Para comenzar a analizar un proyecto no comenzaremos intentando ver que objetos tendrá la aplicación sino más bien si interaccionará con personas o con máquinas, como será esta interacción, si pertenece a un conjunto más amplio de programas o si se coordinará con otras aplicaciones. A continuación se exponen una serie de técnicas para recopilar datos para definir un modelo de análisis.

Casos de uso


Es una visión del sistema desde el punto de vista del usuario define el sistema con un escenario de uso habitual de interacción del sistema con el usuario final. Esta visión debe quedar definida de forma clara y sin ambigüedades y será un excelente modelo de creación de requisitos y de validación de pruebas. El resultado final es un diagrama de casos de uso de UML que puede representarse en diferentes niveles de abstracción.

lunes, 22 de abril de 2013

Principios de la programación orientada a objetos (III)

Cómo identificar las Clases y Objetos


En el mundo real es sencillo identificar los objetos, sus atributos y sus funciones, pero a la hora de hacer un programa informático esta identificación no resulta tan evidente. Los objetos desde la realidad se manifiestan como:

Entidades Externas. Pueden ser cosas o personas externos al sistema pero que producen o consumen información del sistema.

Cosas. Objetos físicos del sistema, informes, facturas, maquinas, etc.

Ocurrencias o sucesos. Cuando se produce un cambio en el tiempo, sacar dinero de una cuenta, una máquina llega al final de carrera, etc.

Papeles o roles. Los desempeñados por personas que interactúan en el sistema

Unidades organizacionales. Si son relevantes en un sistema, división, equipo, etc.

Lugares. Establecidos en el contexto del sistema. Planta, Nº de aparcamiento, Plaza, Almacén, etc.

Estructuras. Una clase de objetos, maquinas, sensores, etc.

Así por ejemplo para un programa que juegue al ajedrez podemos identificar:

Clase/ Objeto Potencial

Jugador -> entidad externa o rol

Pieza ->cosa

Tablero -> cosa

Posición -> atributo de la pieza

Captura -> ocurrencia

Movimiento -> ocurrencia

Color -> atributo de la pieza

Para definir las clases y los objetos conviene analizar sintácticamente el enunciado o especificación del software a desarrollar detectando los posibles objetos (nombres) y los posibles métodos (verbos). Se han definido seis características para considerar si se incluye un objeto en un modelo de análisis:

Servicios Necesarios. Debe ser capaz de cambiar el valor de sus atributos a través de un conjunto de operaciones identificables.

Información retenida. La información acerca del objeto debe ser recordada para que el sistema funcione.

Atributos Múltiples. Un objeto debe tener atributos múltiples, si sólo tiene uno se puede considerar durante el análisis pero seguramente se pueda incluir dicho atributo dentro de otro objeto 

Operaciones Comunes. Las operaciones tienen que ser aplicables a todas las ocurrencias del objeto.

Atributos Comunes. Los atributos tienen que ser aplicables a todas las ocurrencias del objeto.

Requisitos esenciales. Las entidades externas que intervienen en el problema consumiendo o produciendo información esencial para el sistema también deben ser incluidas como objetos.

Para incluir un objeto en nuestro modelo, debe satisfacer la mayoría de los puntos mostrados anteriormente. Una vez elegido el objeto, sus atributos se buscan con la premisa de que definan completamente los objetos que los hacen únicos.

Si retomamos el ejemplo del ajedrez podemos ver si cumplen los requisitos.

Clase/ Objeto Potencial

Jugador -> entidad externa o rol Rechazado: no cumple muchas características.

Pieza ->cosa Aceptado: Cumple todas

Tablero -> cosa Rechazado: solo contiene la posición que pasa a atributo de la pieza

Posición -> atributo de la pieza.
Pasa a atributo de la pieza

Captura -> ocurrencia.
Pasa a método de la pieza

Movimiento -> ocurrencia.
Pasa a método de la pieza

Color -> atributo de la pieza.
Pasa a atributo de la pieza

Para encontrar las operaciones (métodos) hay que prestar atención a los verbos de la definición del sistema. Así en la definición del juego de ajedrez el verbo mover es importante y define un método. También existe el verbo capturar, por lo que habrá que tenerlo en cuenta a la hora de diseñar la clase.

Finalmente tendremos sólo una clase principal llamada Pieza que tendrá como propiedades el color de la pieza y su posición sobre el tablero, también será necesario añadir otra propiedad que no viene en la lista que nos diga el tipo de pieza de que se trata.

Tendrá un método mover y otro capturar que puede fusionarse como caso especial del método mover. También es conveniente heredar una clase para cada tipo de pieza. De este modo tendremos la clase padre Pieza con las clases hijas Peón, Torre, Caballo, Alfil, Rey y Reina, todas heredan todos los atributos como Color, Posición, etc. y cada una de ellas implementa un método diferente llamado Mover que incluye el caso especial Capturar. Dicho caso especial obliga a introducir otro atributo en la clase pieza que nos indique si la pieza está en juego o no. 

El sistema para un lenguaje concreto (Visual Basic.NET) se representaría así en UML:


Programación orientada a objetos



viernes, 19 de abril de 2013

Principios de la programación orientada a objetos


Clases y Objetos

Se define una clase como un concepto que encapsula las abstracciones de datos y procedimientos que se requieren para describir el contenido y comportamiento de alguna entidad del mundo real. Además este encapsulamiento aísla la clase del resto del código de programa lo que permite ocultar la información que contiene y desacoplar la clase del resto del código del programa. Esto es muy beneficioso pues una vez una clase ha sido implementada y probada podemos desacoplarla del resto del programa haciendo este más sencillo, además de poder reutilizar dicha clase como un módulo en múltiples programas.
Una vez una clase está hecha y probada al programador le basta con saber cómo invocarla y lo que hace esta para poder utilizarla como un módulo separado del resto del programa. Este modo de trabajar permite montar programas como si trabajásemos con ladrillos o bloques de construcción, sin perder el tiempo de redefinir y probar cada ladrillo cada vez que lo necesitamos.
 No hay que olvidar que cada clase en realidad es un patrón o una plantilla que describe una colección de objetos similares y que el objeto concreto será lo que utilizaremos en el código fuente de nuestro programa.
Todos los objetos que genera la clase heredan sus propiedades o atributos y las operaciones o métodos disponibles para la manipulación de estos.
Las clases soportan la herencia por lo que una clase puede tener una o varias clases hijas que heredan las propiedades y métodos de la clase base.
 La mayoría de los objetos físicos tienen características tales como forma, peso, color y tipo de material. Las personas tienen características como fecha de nacimiento, padres, nombre y color de los ojos. Un atributo o propiedad puede verse como una relación binaria entre una clase y su dominio.
La «relación» binaria anteriormente señalada implica que un atributo puede tomar un valor definido por un dominio enumerado. En la mayoría de los casos, un dominio es simplemente un conjunto de valores específicos.
Por ejemplo, la clase Coche tiene una propiedad colorEl dominio de valores de color puede ser (blanco, negro, plata, gris, azul, rojo, amarillo, verde). Pero el dominio también puede ser un conjunto de clases por ejemplo su en vez de Color fuera TipoMotor, en este caso el dominio sería Inyección, Diesel, Gasolina que representa un conjunto de clases que a su vez tiene sus propiedades.

Métodos

Si un método no devuelve un valor como por ejemplo Acelerar, lo llamamosProcedimiento, si por el contrario tiene un valor de retorno por ejemplo CalculaArea lo llamamos Función.
Dentro de una clase nos referimos a ellos como Métodos.
Los métodos son algoritmos que operan con los datos contenidos en las propiedades y representan el comportamiento del objeto.
El disparo de un método en un objeto concreto se llama mensaje y puede ir de algo tan sencillo como devolver el color de una pieza de ajedrez en el objeto Torre de la clase Pieza a algo tan complejo como calcular la declaración de la renta del objeto declaracionClientexx de la clase Renta2013. Este último caso puede implicar la generación de otros mensajes a otros objetos en cascada.
Los mensajes son el medio a través del cual interactúan los objetos. Los métodos son los procedimientos invocados cuando un objeto recibe un mensaje.

Encapsulamiento, herencia y polimorfismo

Como ya se ha dicho anteriormente, la clase encapsula las propiedades y los métodos, quedando estos ocultos al programa principal, lo que reduce la propagación de errores si hay cambios, pues estos son mucho más sencillos de realizar y más localizados. Además si no se toca la clase y está suficientemente probada, se sabe que la clase no contiene los fallos.
La encapsulación facilita la reutilización de código, (componentes). Además las interacciones entre módulos están simplificadas, el objeto llamante sólo debe conocer los parámetros a enviar sin preocuparse de la estructura interna del objeto llamado.
Una Clase hereda todos los atributos de su clase padre, esto quiere decir que todo el código de la clase padre está disponible para la clase hija, no siendo necesario repetirlo de nuevo.
De este modo cualquier cambio en una clase padre se propaga inmediatamente a todas las clases hijas, una clase existente puede sobrescribirse e implementar nuevas versiones de propiedades o métodos para la nueva clase.
El polimorfismo permite utilizar toda la operativa común de una clase y al mismo tiempo dividir las partes que difieren, de tal forma que se reutiliza solamente el código necesario. Así si queremos calcular el área de diferentes formas geométricas podemos definir una clase padre Figura que contenga los atributos y operaciones comunes para todas las figuras y luego crear clases derivadas para cada figura, por ejemplo Cuadrado, Triangulo, Circulo. En la clase base definimos el método calcular área y lo dejamos vacío y luego en cada clase hija definimos el método concreto de cada figura de tal forma que en el código cliente bastará con llamar a
Circulo1.CalcularArea, Cuadrado3.CalcularArea o Triangulo57.CalcularArea sin preocuparnos más, pues cada objeto ya sabe cómo calcular el área correspondiente.
Si hay que añadir una nueva figura apenas hay que tocar código, basta con crear una nueva clase hija y redefinir en ella el método CalcularArea. Sólo tendremos que crear y probar la nueva clase, y si hay fallos sabemos que estarán localizados en la nueva clase y no afectarán a lo anteriormente hecho