Apúntate...


Consultas, desarrollo de programas y petición de presupuestos:

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

sábado, 2 de noviembre de 2013

La Herencia entre clases: inherits

¿que es la herencia?
 La herencia facilita la creación de objetos a partir de otros ya existentes e implica que una subclase obtiene todo el comportamiento (métodos) y eventualmente los atributos (variables) de su superclase.
La clase de la que se hereda se suele denominar clase base, clase padre, superclase, clase ancestro.
La clase derivada de la herencia, se le puede añadir sus propios métodos o cambiar los definidos en la clase superclase, para modificar su comportamiento.

Es a destacar, el hecho de que cuando se usa como parámetro en una función una clase padre, dicha función admitirá también como objetos válidos, los objetos heredados de la clase padre.

Fig 1: Esquema del uso de herencia simple con clase padre: Persona,
y clases heredadas: administrativo, docente y personal limpieza

Ref: http://es.wikipedia.org/wiki/Herencia_(inform%C3%A1tica)

¿como se consigue la herencia en Gambas3?
Simplemente al iniciar la clase, se usa esta orden:


  • INHERITS ParentClass


Donde ParentClass es la clase de la que queremos heredar los métodos y propiedades.

En gambas3 solo existe la "herencia Simple", la herencia múltiple hay que simularla mediante composición de clases.


Ejemplo:
Hacer un programa que registe los Docentes, Administrativos y personal de limpieza. Con los métodos y atributos de la figura 1.
Haremos la siguiente estructura de clases:

Declararemos la clase Persona:
->
En la función registrar (número de linea 51), se dejan varios parámetros en forma de opcional (se pueden poner o no) y tipo variant (que admitirían cualquier tipo de datos), que nos servirán para usarlo en las clases heredadas.

Declaremos las clases que la heredan:
Administrativos
->
Docente:
->
A destacar la linea 43 donde se hace uso de Me.Sueldo() para calcularlo segun la funcion que esta definida en la clase (lineas 57 y sucesivas). Sin embargo en la linea 40, se hace uso de Super.Nombre para llamar a la clase padre.

PersonalLimpieza
->
Y la clase Main: (inicio del programa)
->
Aqui podemos destacar el uso de la funcion mostrar(), que recibe una clase persona (o cualquiera que herede de ella) y trabaja con los métodos que tenga sin ningún problema. Por ejemplo en este caso se le envia una clase PersonalLimpieza y nos muestra sus datos


Codigo completo: enlace a box.com

jueves, 27 de diciembre de 2012

Arrays: Propiedades y Métodos

Un arreglo de objetos de clase es útil cuando se requieren instancias múltiples de la misma clase.

Hay dos formas en las que se pueden relacionar los arreglos con los objetos:

  • Un arreglo puede contener elementos de tipo objetos
  • Una clase puede contener como atributos variables de tipo arreglo


Vamos a hacer un ejemplo con la 2º forma.

Ejemplo: Queremos llevar la gestión de articulos de una pequeña tienda.

Para ello vamos a usar 2 clases:
La clase ClassArticulo: contiene los datos del articulos ademas de varios metodos para modificar los datos del mismo
La clase ClassListaArticulo: contiene un array de objetos de la clase ClassArticulo, mas varios métodos para modificar este array (añadir articulos, buscar, registrar llegadas y salidas de articulos y ver un inventarios de los articulos existentes).

ClassArticulo:
Los articulos tienen las siguientes propiedades:
clave: es un numero que identifica el articulo de una manera unica, por ejemplo 11034
existencia: es un numero que indica la cantidad existente en el almacen de un determinado articulo
precio: precio del articulo

Ademas tiene varios métodos:
inicializa: le dá valores a las propiedades, clave, existencia y precio del objeto articulo
registraEntrada: indica que en el almacen han entrado un determinado numero
registraSalida: indica que del almacen han salido un determinado numero , ademas hace una comprobación, si la salida supera al numero de existencias, te indica un mensaje de error, y no saca ningun articulo.


' Gambas class file

Property clave As Integer
Private hclave As Integer

Property existencia As Integer
Private hexistencia As Integer

Property precio As Float
Private hprecio As Float

Public Sub inicializa(ValorClave As Integer, ValorExistencia As Integer, ValorPrecio As Float)
hclave = ValorClave
hexistencia = ValorExistencia
hprecio = ValorPrecio
End

Public Sub registraEntrada(cant As Integer)
hexistencia += cant
End

Public Function registraSalida(cant As Integer) As Boolean

If cant > hexistencia Then
Return False 'indica que no hubo suficientes articulos
Else
hexistencia -= cant
Return True ' indica que si registró la salida
Endif
End

Private Function clave_Read() As Integer
Return hclave
End

Private Sub clave_Write(Value As Integer)
hclave = Value
End

Private Function existencia_Read() As Integer
Return hexistencia
End

Private Sub existencia_Write(Value As Integer)
hexistencia = Value
End

Private Function precio_Read() As Float
Return hprecio
End

Private Sub precio_Write(Value As Float)
hprecio = Value
End



ClassListaArticulo:

Va a tener una propiedad "lista" que es un array de articulos ( ClassArticulo[] ), manejada por la variable privada "hlista"
Y varios métodos:
anadirArticulo():crea un objeto temporal del tipo classArticulo, nos pide los distintos datos del articulo. y la añade (usando el método add) a la lista de articulos.
verInventario(): devuelve una cadena de texto, con los datos de todos los articulos existentes (recorre con un for next el array "lista"
busca(): dado una clave busca  en la lista, un articulo que tenga esa clave, si no lo encuentra da un mensaje de error y si lo encuentra devuelve la posicion dentro del array del articulo.
registrallegada(): pide la clave del articulo y la cantidad, busca la posicion dentro del array de articulos y le añade la cantidad.
registraSalida(): pide la clave del articulo y la cantidad, busca la posicion dentro del array de articulos, y le quita la cantidad (si no puede, te lo indica en un mensaje)



' Gambas class file

Property lista As ClassArticulo[]
Private hlista As New ClassArticulo[]

Private Function lista_Read() As ClassArticulo[]
Return hlista
End

Private Sub lista_Write(Value As ClassArticulo[])
hlista = Value
End

Public Function verInventario() As String
Dim texto As String
Dim i As Integer
texto = "La lista de articulos en el almacen es la siguiente:" & gb.CrLf
texto &= "Clave" & gb.Tab & "Cantidad en Existencia" & gb.tab & "Precio" & gb.CrLf
For i = 0 To hlista.Max
texto &= hlista[i].clave & gb.Tab & hlista[i].existencia & gb.tab & hlista[i].precio & gb.CrLf
Next
'devuelvo el texto generado de todos los elementos de la lista
Return texto
End

Public Function busca(BuscaClave As Integer) As Integer
Dim i As Integer
Dim posicion As Integer = -1 '-1 indica que no se encontro el artidulo
For i = 0 To hlista.Max
If hlista[i].clave = buscaclave Then
posicion = i 'encontrado el articulo
Return posicion
Endif
Next
Return posicion
End

Public Sub registrallegada()
Dim posicion As Integer, cve As Integer, cantidad As Integer
Print "Cual es la clave del articulo:"
Input cve
'busca la clave en el almacen:
posicion = busca(cve)
If posicion <> -1 Then
Print "Cuantos artículos llegaron: "
Input cantidad
hlista[posicion].registraEntrada(cantidad)
Print "Ok,cantidad introducida...." & gb.CrLf
Else
Print "*** Esa clave no existe ***" & gb.CrLf
Endif
End

Public Sub registraSalida()
Dim posicion As Integer, cve As Integer, cantidad As Integer
Print "¿cual es la clave del articulo? "
Input cve
'busca la clave en el almacen...
posicion = busca(cve)
'[
If posicion <> -1 Then
'{
Print "¿cuantos articulos salieron? "
Input cantidad
If (hlista[posicion].registraSalida(cantidad) = False) Then
Print "No hay suficientes articulos..." & gb.CrLf
Endif
'}
Else
Print "Esa clave no existe" & gb.CrLf
Endif
']
End

Public Sub anadirArticulo()
Dim valorclave As Integer, valorexistencia As Integer, valorprecio As Float
'creo un articulo temporal que sera el que use para los datos iniciales
Dim arttemp As New ClassArticulo
'pregunto y obtengo los valores que me interesa.
Print "Teclea la clave para el articulo:"
Input valorclave
Print "Teclea la existencia del articulo:"
Input valorexistencia
Print "Teclea el precio del articulo:"
Input valorprecio
'inicializo los datos del articulo
arttemp.inicializa(valorclave, valorexistencia, valorprecio)
'añado al array de articulo el nuevo articulo
hlista.Add(arttemp)
End


Ademas de estas dos clases, tenemos el módulo MMain, que contiene una subrutina llamada Main, que va a procesar un pequeño menu, donde el usuario mediante teclas va a introduccir que opcion quiere que se realice.


' Gambas module file

Public Sub Main()
Dim listaArticulos As New ClassListaArticulos
Dim opc As String
Repeat
opc = menu()
Select opc
Case "a"
listaArticulos.anadirArticulo()
Case "b"
Print listaArticulos.verInventario()
Case "c"
listaArticulos.registrallegada()
Case "d"
listaArticulos.registraSalida()
End Select
Until (opc = "e")
'fin del programa
End

Public Function menu() As String
Dim opc As String
Print ""
Print "Menu de Opciones" & gb.CrLf
Print "(a) Añadir Articulo ";
Print "(b) Ver Inventario ";
Print "(c) Registrar una llegada al almacen " & gb.CrLf
Print "(d) Registrar una salida de almacen ";
Print "(e) Salir de la aplicacion" & gb.CrLf
Repeat
Print "Opcion: "
Input opc
Until ((opc >= "a") Or (opc <= "e"))
Return opc
End


Para descargar el ejemplo completo: ejemplo de array de objetos: gestion de articulos

Enlace GambasWiki:
http://gambaswiki.org/wiki/doc/object-model?l=es
http://gambaswiki.org/wiki/cat/object?l=es
http://gambaswiki.org/wiki/lang/type/object



martes, 25 de septiembre de 2012

Modificar un formulario desde otro formulario

Algunas veces se nos plantea modificar una propiedad de un control  que esta en un formulario desde otro formulario.


¿como hacerlo?
Existen dos formas:
- Declarando los controles de formularios como públicos
  •  Esto se hace en el menú Proyecto / Propiedades / Opciones / Los controles del formulario son públicos = "SI"
-Creando una propiedad en los formularios, y esta en sus funciones _Read y _Write, haga los cambios oportunos en el control.
  -->
Property texto As String ''texto del labeltext1

Private Function texto_Read() As String

Return Label1.Text

End

Private Sub texto_Write(Value As String)

Label1.Text = value

End


 Descarga del ejemplo (gambas3.3):  Enlace


 
Fuente:
http://www.gambas-es.org/viewtopic.php?f=1&t=2619

martes, 28 de agosto de 2012

Introducción a la Programación Orientada a Objetos


La orientación a objetos es un paradigma de programación  (POO) que facilita la creación de programas de calidad por sus factores que potencian el mantenimiento, la extensión y la reutilización del software generado bajo este paradigma.

  La programación orientada a objetos trata de amoldarse al modo de pensar del hombre y no al de la máquina.



Conceptos de Programación Orientada a Objetos


Empecemos con un ejemplo:  Supón que estas en un estacionamiento caminando hacia tu auto, entonces tomas el control remoto y oprimes un botón, en ese momento se desactiva la alarma de tu automóvil.

El control remoto es un objeto físico que tiene propiedades: peso, tamaño y también puede hacer cosas:
  •      Puede enviar mensajes al automóvil. No está claro como hace esto, pero no necesitas saberlo para poder usarlo; solo necesitas saber qué botón oprimir para que esto ocurra


Los botones son la interfase del control remoto. Si conoces la interfase de un objeto, lo puedes usar para realizar acciones sin entender cómo trabaja.



El automóvil también es un objeto físico, tiene propiedades y realiza acciones (métodos), una de ellas es recibir un mensaje de un control remoto para desactivar la alarma.



Gracias a la abstracción eres capaz de hacer que dos objetos interactúen entre sí, sin necesidad de entender cómo funcionan. Esto también permite que uses otros controles remotos y otros automóviles de otras marcas y otros modelos.



La clave para desarrollar un sistema utilizando los conceptos de Orientación a Objetos es :

  1.     definir qué objetos forman parte del sistema 
  2.     crear abstracciones apropiadas para ellos
  3.    y separar la implementación interna de su comportamiento externo.



Desde el punto de vista de la programación orientada a objetos, la abstracción consiste en ocultar los detalles irrelevantes para que el objeto pueda ser comprendido y utilizado por el usuario. Por un lado, esto disminuye la complejidad permitiendo que el usuario utilice los datos del objeto sin necesidad de conocer detalles, y por otro lado protege los datos evitando que el usuario pueda llegar a ellos y modificarlos sin utilizar las funciones diseñadas para ello, afectando con esto la confiabilidad del sistema.



 

Pero, ¿Que es un Objeto?


Un objeto puede ser alguna cosa física, como una pluma, un escritorio, un gato; pero también hay cosas abstractas que son objetos, como un número o una cuenta bancaria.


Sabemos que algo es un objeto si tiene nombre, se puede describir en base a sus características o propiedades y es capaz de hacer algo o comportarse de cierta manera.



 Por ejemplo:

  Pensemos en una cuenta bancaria sencilla, podemos describirla como un objeto de la siguiente manera:
• Clase: Cuenta Bancaria
• Propiedades: Nombre del dueño, saldo actual, tipo de cuenta.
• Comportamientos (métodos): depositar, retirar, consultar el saldo.


Los lenguajes orientados a objetos nos permiten crear abstracciones encapsulando las propiedades y los comportamientos en un solo concepto llamado clase.


Las propiedades (también llamadas atributos o datos miembro) que pertenecen a una clase se definen como variables
 

Y los comportamientos (también llamados métodos o funciones miembro) se definen como funciones, y éstos tienen la característica de tener acceso a los atributos privados de la clase


La diferencia entre clase y objeto es sutil pero muy importante. La clase es el concepto abstracto, es una especie de molde para crear objetos, define qué atributos y métodos tiene la clase. Por otro lado el objeto es la entidad concreta.



 Por ejemplo:

El tipo de datos "integer" es la clase que contiene todos los numeros enteros, y el objeto seria una variable "edad" que es del tipo "integer"



Objetos o Instancias:
A partir de una clase, se pueden crear instancias, es decir objetos y cada objeto tiene valores distintos para sus atributos.

Por ejemplo:
     Continuando con nuestro ejemplo de la clase cuenta bancaria,
     La clase es Cuenta Bancaria.

Los objetos podrían ser
Objeto 1:

     Cuenta 193                                    
     Nombre del dueño: Jorge López    
     Saldo actual: 5,248.00                    
     Tipo de cuenta: ahorros             

Objeto 2:

      Cuenta 281
      Nombre del dueño: Laura Treviño
      Saldo actual: 3,915.00
      Tipo de cuenta: chequera



Un objeto puede recibir mensajes, los cuales son para pedirle que haga algo, o bien, que cambie alguna de sus propiedades. Esto es equivalente a llamar a una función, solo que al llamar al método se tiene que hacer referencia al objeto específico en el que se ejecutará dicho método.



 Por ejemplo:

Se puede pedir a la cuenta bancaria 193 ejecutar el método depositar con el valor 100, lo cual se reflejará con un cambio en el valor del atributo saldo actual, el nuevo valor para dicho atributo será 5,348.00. Pero nota que el valor del atributo saldo actual de la cuenta 281 permanece sin cambio.


sábado, 18 de agosto de 2012

Ejemplo de Herencia y Polimorfismo (I: Modo Consola)

Vamos a pasar a describir un ejemplo de herencia y polimorfismo en Gambas3.

El objetivo es hacer un programa que calcule el perímetro de rectángulos, cuadrados y circunferencia, usando la programación orientada a objetos.


Podemos crear una clase, la llamaremos classfigura, que englobe a los diversos tipos (rectangulo,cuadrado,circuferencia).


Esta clase figura tendrá un método para calculo del  perimetro (CalculoPerimetro) y otro que he añadido para que nos de información de la figura.


' Gambas class file

Public Function CalculoPerimetro() As Float

End


Public Function define() As String
End

Ahora añadiremos varias clases, que hereden de la clase figura. Esto se hace haciendo click con el botón derecho en el menu del proyecto:
Pulsando en el menu "Nuevo" y luego "Clase"

Ahora eligimos que herede de la clase Figura y le pondremos el nombre de ClassCuadrado

Repetimos los pasos para crear las clases ClassRectangulo y ClassCirculo, todas ellas heredan de la la classFigura.

Ahora, nos vamos a la clase Cuadrado, y redefinimos las funciones (a esto se le llama polimorfismo):

' Gambas class file
Export
Inherits ClassFigura

Private $lado As Float

Public Sub _new(lado As Float) ''constructor: pide las longitudes del lado
$lado = lado
End

Public Function CalculoPerimetro() As Float '' calculo del perimetro
Dim perimetro As Float

perimetro = $lado * 4
Return perimetro
End

Public Function define() As String ''Escribe que figura es
Return "Cuadrado"
End



Ahora la clase Réctangulo: classRectangulo

' Gambas class file
Export
Inherits ClassFigura

Private $ladoA As Float
Private $ladoB As Float

Public Sub _new(ladoA As Float, ladoB As Float) ''constructor: pide las longitudes de los lados A y B

$ladoA = ladoA
$ladoB = ladoB

End

Public Function CalculoPerimetro() As Float '' calculo del perimetro

Dim perimetro As Float

perimetro = $ladoA * 2 + 2 * $ladoB

Return perimetro

End



Public Function define() As String ''Escribe que figura es

Return "Rectangulo"

End

Y ahora la clase Circulo: classCirculo

' Gambas class file
Export
Inherits ClassFigura

Private $radio As Float

Public Sub _new(radio As Float) ''constructor: pide el radio del circulo
$radio = radio
End

Public Function CalculoPerimetro() As Float '' calculo del perimetro
Dim perimetro As Float

perimetro = 2 * $radio * Pi
Return perimetro
End

Public Function define() As String ''Escribe que figura es
Return "Circulo"
End

Por ahora no vemos nada nuevo.. ninguna utilidad...¿no?... ahora verás...
En la clase de inicio, vamos a definir varias instancias y una función "infome":

' Gambas module file

Public Sub Main()

Dim cua As New ClassCuadrado(19)

Dim rect As New ClassRectangulo(10, 5)

Dim cir As New ClassCirculo(8)

Print "Escribimos los perimetros de las figuras creadas anteriormente"
informe(cua)
informe(rect)
informe(cir)

End

Public Function informe(a As ClassFigura) As Float

Print a.define(); " ";
Print a.CalculoPerimetro()

End

Fíjate que la función informe recibe como argumento una clase figura, y en la funcion Main, le estamos mandando diversas clases (pero todas ellas heredan de la clase figura!!!)
Lo que nos va a imprimir, va a hacer el cálculo del perímetro, siendo la forma de calcularmo como lo hayamos definido en la figura que le mandemos...

Resultado en la consola:

Escribimos los perimetros de las figuras creadas anteriormente
Cuadrado 76
Rectangulo 30
Circulo 50,2654824574367

La gran ventaja que tiene este método, es que el día de mañana, que añadamos una nueva figura (por ejemplo una elipse),  la función "informe" no cambiará en nada, siendo capaz de darnos el cálculo del perímetro.

Actividad:
1) Añade la claseElipse, para que nos calcule el perimetro.
2) Añade a las clases anteriores la fórmula de cálculo del área. Y que el programa principal sea capaz de darnos el área de las figuras.


Enlace de descarga del ejemplo: Enlace


A falta de donativos... un poco de publicidad