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




Definiciones generales


Option Explicit On  exige la declaración de variables

Option Strict On  exige tipificación de variables y conversión explícita de tipos, es muy útil para que salten en tiempo de diseño errores que luego saltarían en tiempo de ejecución.


Option Compare Binary comparación por valores binarios de caracteres, opción por defecto a <> A

Option Compare Text  comparación por valor textual, a= A

Paso por valor (ByVal parametro As Integer) copia de la variable

Paso por referencia (ByRef parametro As Integer) dirección de la variable

Constantes


#Const nombre = "valor"

Variables Static


Retienen su valor al finalizar el procedimiento en el que han sido declaradas, si salimos y volvemos a entrar, no se inicializan.
Static Dim Importe As Integer

Namespaces


Organizan las clases dentro del entorno, agrupándolas de un modo lógico y jerárquico.

Namespace EspacioDeNombres
      Public Class clase1
End Class

      Public Class clase2
End Class


Public Class claseN
End Class

End Namespace

Para acceder desde otro código a este namespace:

Imports Nombre_espacio.Nombre_clase

Por ejemplo los namespaces del sistema.

Imports System.Windows.Forms

También es posible acceder a los espacios de nombres de otros ensamblados.

Para acceder a una clase de  un namespace diferente si no hacemos el import también se puede incluir el namespace en su declaración.

Namespace espacio2
    Public Class CClase2
        Public Sub Metodo1(ByVal pieza As Object)
            Dim variable As New espacio1.CClase1
            variable.Nombre = "Juan"
        End Sub
    End Class
End Namespace


Punto de entrada al programa


Public Sub main()

      
End Sub

Clases


Método constructor New(), es el primer método que se ejecuta, donde se escribe el código de inicialización para el objeto.

Public Sub New(ByVal NombreParametro As String)
…      
End Sub


Código de clase y código de cliente


El Código de clase, es el código que escribimos para crear nuestra clase

Public Class CNombreclase
  

End Class

El código cliente, es el código que hace uso de la clase, creando o instanciando objetos a partir de la misma.

Dim m_persona As CPersona
m_persona = New CPersona("José García")


Propiedades de la clase. (Encapsulación)


Los datos y método de la clase se encapsulan con el objetivo de que se puedan usar desde el exterior pero no sea necesario conocer ni tocar lo que hay dentro de la clase.

Una clase contiene variables que se encapsulan como propiedades, y contiene métodos que también se encapsulan.

La encapsulación de una variable se realiza del siguiente modo:

Dentro de la definición de clase  se escribe.

Public Class CNombreclase

Private m_nombre As String = ""

Public Property Nombre() As String
        Get
            Return m_nombre
        End Get
        Set(ByVal value As String)
            m_nombre = value
        End Set
    End Property

End Class

Esto impedirá que desde fuera de la clase se pueda acceder a la variable de la clase m_nombre para ello deberemos acceder a la propiedad Nombre a través de los métodos Get y Set establecidos para ella, en estos métodos se puede poner código que valide el tipo de datos o realice cualquier otra validación que deseemos, esto impedirá errores cuando no se introduzcan los datos correctos.
Desde el código cliente podemos hacer

Nombre_Cliente = New CNombreClase()
Nombre_Cliente.Nombre = "Nombre a introducir"

De este modo, cuando pulsemos el punto después de Nombre_Cliente no se desplegará la variable, pero si la propiedad Nombre de la clase. Esto se llama encapsulación y previene de asignaciones incoherentes.

Propiedades virtuales


Consiste en una propiedad que no tiene correspondencia directa con una variable de la clase, ya que podemos crear el método property sin que esté asociado a una variable.

Public Class CNombreclase
Public ReadOnly Property Mes_Alta() As String
        Get
            Return m_mes_alta
        End Get
    End Property
End Class

Propiedades de sólo lectura o sólo escritura


Sólo utilizarán la parte Set o Get según proceda.

Public Class CNombreclase
    'Sólo lectura
    Public ReadOnly Property Mes_Alta() As String
        Get
            Return m_mes_alta
        End Get
    End Property
    'Sólo escritura  
Public WriteOnly Property Nombre() As String
    Set(ByVal value As String)
            m_nombre = value
        End Set
    End Property
End Class

Me y MyClass


Se utiliza para referirse a la propia clase si estoy definiendo código dentro de ella.

Public Class CNombreclase

Private m_nombre As String = ""

Public Function Mayusculas() As String
      End Function

      Console.writeline(“texto”, me.m_nombre)
      Console.writeline(“texto”, myclass.Mayusculas)
End Class


Sobrecarga de Métodos. (Polimorfismo)


Un único nombre de método con diferentes parámetros en cada declaración, con la llamada distingue cual debe ejecutar.
Para declararlos se pone delante la palabra clave overload.

Public Overloads Sub Calcular_Sueldo()
        ' Añadir código.
End Sub
Public Overloads Sub Calcular_Sueldo (ByVal parametro1 As String)
        ' Añadir código.
End Sub

Public Overloads Sub Calcular_Sueldo (ByVal parametro1 As String, ByVal parametro2 As Integer)
        ' Añadir código.
End Sub

Las listas de parámetros deben ser diferentes en al menos:
-número de parámetros
-orden de los parámetros
-tipo de datos de los parámetros

Enlaces (Binding) de variables a referencias de objetos


El enlace temprano asocia la variable con el objeto en tiempo de diseño.

Dim Nombre_Cliente as CNombreClase
Nombre_Cliente = New CNombreClase()

Enlace tardío, asocia la variable con el objeto en tiempo de ejecución.

Dim Nombre_Cliente as Object
Nombre_Cliente = New CNombreClase()

Herencia


Para crear una clase derivada debemos declarar una nueva clase, especificando cual es su clase base mediante la palabra clave Inherits.

Public Class CCaballo
    Inherits CPieza


CCaballo es hija de CPieza

También se puede poner así

Public Class Peon : Inherits Pieza


Reglas de ámbito


Public:   Lo ve todo el mundo.

Private:  Lo ve sólo la propia clase.

Protected: Lo ve la clase y las clases hijas.

Friend: Un miembro de la clase (variable o método) declarado como friend, será accesible por todo el código de su proyecto o ensamblado.

Friend mVariable as Double

Protected Friend: Serán accesibles desde el código de su clase, clases derivadas, y por todo el código que se encuentre dentro de su ensamblado.


Herencia y sobrecarga de métodos


Podemos sobrecargar métodos existentes en una clase dentro de una clase derivada. Utilizamos la palabra clave Overloads.

Public Class CEmpleado
     Public Sub CalcularIncentivos
     End Sub
End Class

Public Class CAdministrativo: Inherits CEmpleado
     Public Overloads sub CalcularIncentivos (ByVal iHoras as integer)
     End Sub
End Class


MyBase


Proporciona acceso a los miembros de una clase base desde su correspondiente subclase.
Public Class CAdministrativo: Inherits CEmpleado
            MyBase.CalcularIncentivos()

Herencia y sobreescritura de métodos


Consiste en la capacidad  de crear en una clase derivada, un método que altere parcial o totalmente la implementación ya existente de dicho método en la clase base.
Puede tener el mismo nombre y clase de parámetros. Se utiliza la palabra clave Overridable en la clase base y Overrides en las clases derivadas.

'Método padre vacio, se definirá en cada clase derivada
Public Overridable Function Mover(ByVal NuevaPos As String) As Boolean
        Me.Posicion = NuevaPos
        Return True
End Function
En las clases derivadas se pone:
Public Overrides Function Mover(ByVal NuevaPos As String) As Boolean
        Me.Posicion = NuevaPos
'Aquí se implementa el código que se desee
       Return True  

End Function


Herencia y métodos constructores


Podemos crear una clase base con constructor y una subclase sin él.
Si ambos disponen de constructor , se ejecutará primero el de la clase base y luego el de la clase derivada.
Si el constructor de la clase está parametrizado, el contructor de las clases derivadas deberá llamar al de la clase base con my base.

Friend Class CEmpleado

    Public Sub New(ByVal IsNombre As String)
    End Sub
End Class

Friend Class CAdministrativo
    Inherits CEmpleado

    Public Sub New()
        MyBase.New("Juan")
    End Sub
End Class

Podemos evitarlo creando una sobrecarga de métodos sin parámetros.

Clases selladas no heredables


Si no queremos que nuestra clase pueda ser heredada, debemos usar NotInheritable.
Public NotInheritable Class CEmpleado
End Class

Clases abstractas o no instanciables


Una clase abstracta es aquella que no permite la instanciación directa de objetos a partir de ella, siendo necesaria una clase derivada para acceder a sus miembros. Usaremos MustInherit.

Public MustInherit Class CEmpleado
End Class

Dentro de una clase abstracta podemos implementar propiedades y métodos. Podemos obligar a que determinados miembros sean sobreescritos por la clase heredada; son los denominados miembros abstractos, y se declaran usando la palabra clave MustOverride.
Public MustOverride Sub MesesActivo()

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


En algunas circunstancias puede ser útil codificar un procedimiento que reciba como parámetro un objeto genérico, y dependiendo del tipo de objeto, ejecutar ciertos métodos.
GetType()  Devuelve el tipo de un objeto
CType() Convierte una variable que contiene el objeto al tipo del objeto.

Miembros compartidos (Shared) de una clase


Son miembros que no precisan de una instancia previa de un objeto de la clase para ser utilizados, aunque también pueden ser usados por una instancia de la clase. Así por tanto hay:
Miembros de Instancia. (los de Siempre)
Miembros compartidos . Podemos acceder a ellos sin necesidad de que exista un objeto creado de la clase. Emplearemos la palabra Shared .

Public Shared Sub RangoMoverPieza(ByVal sender As Object)

Para definir una clase como punto de entrada de la aplicación:

Public Shared Sub Main()


Destrucción de Objetos y recolección de basura


Si necesitamos que se efectúe la recolección de objetos que no estén siendo utilizados, ejecutaríamos el método collect() aunque se recomienda no abusar de su utilización.

Interfaces


Proporcionan una lista de propiedades y métodos que posteriormente serán codificados en una o varias clases.

Estructuras


Son similares a las clases, pero las usaremos para  tipos definidos por el usuario, para grandes funcionalidades debemos usar clases.

Public Structure DatosBanco

End Structure

Enumeraciones


Consiste en un conjunto de constantes relacionadas.

Delegados


Es un objeto al que otros objetos ceden (delegan) la ejecución de su código, se conocen como punteros a función con seguridad de tipos.
Public Delegate Sub VerMensaje()

Seguidamente en un procedimiento declaramos una variable del tipo del delegado y conectamos el delegado con el procedimiento que deberá ejecutar empleando la palabra clave AddressOf del nombre del delegado.

Sub main()
        Dim LoDelegTexto As VerMensaje

        LoDelegTexto = AddressOf RangoMoverPieza(False)
End Sub





No hay comentarios:

Publicar un comentario