Portal    Foro    Buscar    FAQ    Registrarse    Conectarse


Publicar nuevo tema  Responder al tema 
Página 1 de 1
 
 
Sobrescribir Un Método De Una Clase
Autor Mensaje
Responder citando   Descargar mensaje  
Mensaje Sobrescribir Un Método De Una Clase 
 
Buenos días!.

Me gustaría cambiar/crear otro/sobrescribir el método Rectangle que usa la clase Paint.
Quiero que el argumento que recibe sea una instancia de la clase Rect y no
cuatro valores enteros.

No sé, ni sabría como es el código original que usa la clase Paint para dibujar un rectangulo.
Tan solo uso su método.

Debe existir distintas formas de hacerlo. En principio he creado una nueva clase, llamada Pintar.
En esta clase que hereda de la clase Paint, he creado un método que es Rectangulo:

Hasta ahora la clase Pintar. Es así:

Inherits Paint

Public Sub Rectangulo(unrectangulo As Rect)
  
  Dim x As Integer
  Dim y As Integer
  Dim ancho As Integer
  Dim alto As Integer
  
  x = unrectangulo.X
  y = unrectangulo.Y
  ancho = unrectangulo.W
  alto = unrectangulo.H
  
  Paint.Rectangle(x, y, ancho, alto)
  
End
 


Lo que me resulta algo extraño con lo grande que puede ser la clase Paint de gambas.
Hacer esto:

Private dibujando As New Pintar
 


Es una instancia de la clase Pintar que hereda de Paint que contiene muchos método y se crea uno nuevo.
Un código de uso podría ser este:

Private dibujando As New Pintar

Public Function CreaRectangulo(iancho As Integer, ialto As Integer) As Rect
  
  Dim tmprectangulo As New Rect
  
  With tmprectangulo
    'Para que el rectángulo este centrado horizontamente en el area de dibujo
    .X = Pizarra.Width / 2 - iancho / 2
    'Para que el rectángulo este centrado verticalmente en el area de dibujo
    .y = Pizarra.Height / 2 - ialto / 2    
    .W = iancho
    .H = ialto
  End With
  
  Return tmprectangulo
  
End

Public Sub DibujarRectangulo()
  
  Dim unrectangulo As Rect
  
  unrectangulo = CreaRectangulo(200, 100)
  
  Paint.LineWidth = 5
  dibujando.Rectangulo(unrectangulo)
  'Paint.Rectangle(unrectangulo.X, unrectangulo.y, unrectangulo.W, unrectangulo.H)
  Paint.Brush = Paint.Color(Color.blue)
  Paint.Stroke
  
End

Public Sub Pizarra_Draw()
  
' Por si quiero dibujar tan solo un rectangulo
  DibujarRectangulo
  
End
 


¿ Existe otra forma o posibilidad de sobrescribir o  cambiar el método original ?.

Yo no podría decir al método Rectangle de la clase Paint que en si misma
haga Paint.Rectangle(unrectangulo as Rect)

 Estaría raramente escrita.

¿ Qué me aconsejáis ?.

No creo que un observador sea lo adecuado. Esto es para eventos, no para métodos.

Saludos
 




===================
Gambas Básico
"No es un bug, es una característica no documentada"
 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Sobrescribir Un Método De Una Clase 
 
En la ayuda de gambas, existe el código equivalente al método Rectangle de la clase Paint.

Paint.MoveTo(X, Y)
Paint.LineTo(X + Width, Y)
Paint.LineTo(X + Width, Y + Height)
Paint.LineTo(X, Y + Height)
Paint.ClosePath()
 


Que puede ser el mismo código interno del método (la primera capa).  
Cabe la posibilidad que mi rectángulo sea "mas chulo" que el que usa la clase original
y quiera rellenarlo de serpientes...era broma.  

Entonces...Pintar.rectangulomaschulo(..).. ¿ no ?.  
No se me ocurre por ahora otra forma que crear una clase nueva. Mmmm.

Saludos
 




===================
Gambas Básico
"No es un bug, es una característica no documentada"
 
última edición por Shell el Lunes, 09 Abril 2018, 12:52; editado 1 vez 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Sobrescribir Un Método De Una Clase 
 
Aunque yo haga esto:

Inherits Paint

Public Sub Rectangle(unrectangulo As Rect)
  
  Dim x As Integer
  Dim y As Integer
  Dim ancho As Integer
  Dim alto As Integer
  
  x = unrectangulo.X
  y = unrectangulo.Y
  ancho = unrectangulo.W
  alto = unrectangulo.H
  
  Paint.MoveTo(x, y)
  Paint.LineTo(x + ancho, y)  
  Paint.LineTo(x + ancho, y + alto)
  Paint.LineTo(x, y + alto)
  Paint.ClosePath()
  
End

 


Estoy usando el mismo nombre de método para la Clase Pintar que coincide con el nombre del método Rectangle de la clase Paint.
Con lo que al ejecutar, gambas me devuelve el error:

Citar:

Paint.Rectangle está mal sobrescrita en la clase Pintar2 ( por decir otra )


Saludos
 




===================
Gambas Básico
"No es un bug, es una característica no documentada"
 
última edición por Shell el Lunes, 09 Abril 2018, 13:06; editado 1 vez 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Sobrescribir Un Método De Una Clase 
 
¿ Cual es el motivo de que esto no sea posible ?.

Inherits Paint

Public Sub Rectangle(unrectangulo As Rect, Optional radio As Float = 0)
  
  Super.Rectangle(unrectangulo.x, unrectangulo.y, unrectangulo.W, unrectangulo.H, radio)
  
End
 


Esto es funcional con ListBox:

' MyListBox class
Inherits ListBox

Private $cPos As New Collection
Private $aKey As New String[]

' Reimplements the Add method
Public Sub Add(Text As String, Key As String, Optional Pos As Integer = -1)
  
  ' Adds the item to the list box
  Super.Add(Text, Key, Pos)
  ' Adds the key to key array
  If Pos < 0 Then
    $cPos.Clear
    $cPos[Key] = $aKey.Count
    $aKey.Add(Key)
  Else
    $aKey.Add(Key, Pos)
  Endif
  
End
 


Como sabéis el método Add de ListBox solo acepta un máximo de dos argumentos. El segundo por si queremos que
el primer argumento se añada a algún indice concreto del ListBox.

Que por cierto , ¿ Cómo es que le pasa al método original de ListBox, tres argumentos en el código de arriba ?.  

 listbox_add

Saludos
 




===================
Gambas Básico
"No es un bug, es una característica no documentada"
 
última edición por Shell el Lunes, 09 Abril 2018, 13:59; editado 3 veces 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Sobrescribir Un Método De Una Clase 
 
Shell:

Creo que en gambas no puede redefinir los parametros que iniciales de un método.
Mirate esta forma de "hacerlo" usando un metodo que admita varios parametros (sin definir) y dentro del mismo método, segun el caso de parametros que reciba, haga una cosa u otra
https://cursogambas.blogspot.com.es...-numero-de.html
 




===================
Blog personal
Web: SoloGambas seleccion de articulos dedicados a Gambas
Visita el Curso de Gambas3 ¡¡¡Gratuito!!!
 
jsbsan - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Sobrescribir Un Método De Una Clase 
 
Hola Julio.

Debe ser que es algo temprano y no entendí bien del todo la respuesta.  
"A veces" soy enrevesado explicándome.  

Por un lado he entendido que no se puede cambiar el número de parámetros a un método nativo ya definido.  
No sé si la opción que comentas de "n" parámetros soluciona el problema.

Para que me fuera de orientación estuve viendo el ejemplo de la ayuda online de gambas con la orden Super.
Si se compila la nueva clase MyListBox tal cual, no da problema. Pero cuando se instancia vuelve
a dar el mismo problema de método mal sobrescrito en la clase.

 mismoerror

He copiado el ejemplo para que lo probéis si queréis ver el fallo. Puedo llegar a entender que el nombre del método
no deba ser el mismo, pero como veis en la ayuda, usa el mismo nombre de método para reemplazarlo.  

Saludos

CambiarListBox.tar.gz
Descripción: Intento fallido de sobrescribir el método Add de ListBox 
Descargar
Nombre del archivo: CambiarListBox.tar.gz
Tamaño: 12.19 KB
Descargado: 20 veces
CambiarListBox.tar.gz
Descripción: Intento fallido de sobrescribir el método Add de ListBox 
Descargar
Nombre del archivo: CambiarListBox.tar.gz
Tamaño: 12.19 KB
Descargado: 20 veces
CambiarListBox.tar.gz
Descripción: Intento fallido de sobrescribir el método Add de ListBox 
Descargar
Nombre del archivo: CambiarListBox.tar.gz
Tamaño: 12.19 KB
Descargado: 20 veces

 




===================
Gambas Básico
"No es un bug, es una característica no documentada"
 
última edición por Shell el Martes, 10 Abril 2018, 09:27; editado 2 veces 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Sobrescribir Un Método De Una Clase 
 
Shell:

En gambas (que yo sepa), no se puede sobreescribir un método de una clase.

Lo que puedes hacer es crear un método que acepte n-parametros (un numero indefinido de parametros), y que segun tu definas dentro del metodo. Te paso tu ejemplo que he  modificado para que veas lo de los nparametros y como segun el caso, hace el codigo una cosa u otra..

CambiarListBox-0.0.2.tar.gz
Descripción: Creo un metodo agrega, que integra el metodo normal "add", y otro "add2" que acepta 3 parametros. 
Descargar
Nombre del archivo: CambiarListBox-0.0.2.tar.gz
Tamaño: 11.58 KB
Descargado: 23 veces
CambiarListBox-0.0.2.tar.gz
Descripción: Creo un metodo agrega, que integra el metodo normal "add", y otro "add2" que acepta 3 parametros. 
Descargar
Nombre del archivo: CambiarListBox-0.0.2.tar.gz
Tamaño: 11.58 KB
Descargado: 23 veces
CambiarListBox-0.0.2.tar.gz
Descripción: Creo un metodo agrega, que integra el metodo normal "add", y otro "add2" que acepta 3 parametros. 
Descargar
Nombre del archivo: CambiarListBox-0.0.2.tar.gz
Tamaño: 11.58 KB
Descargado: 23 veces

 




===================
Blog personal
Web: SoloGambas seleccion de articulos dedicados a Gambas
Visita el Curso de Gambas3 ¡¡¡Gratuito!!!
 
jsbsan - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Sobrescribir Un Método De Una Clase 
 
Gracias Julio.

Entonces es un método nuevo lo que propones como solución en la nueva clase heredada.
Pudiendo usar el método nuevo o el nativo. Es interesante y sencilla la opción del método que actúa
como interruptor.

La referencia que encontré sobre este tema en la ayuda de gambas fue:

Citar:

3.5. Symbol Overriding
When a symbol is overridden, the signature of the symbol in the child class must be the same as the signature of the symbol in the parent class.

The rules are:

    A dynamic symbol must be overridden by a dynamic symbol, a static one by a static one.
    A method must be overridden by a method with exactly the same signature (same arguments datatypes, same return value datatype if any).
    A read/write property must be overridden by a read/write property with the same datatype.
    A read-only property must be overridden by a read-only property with the same datatype.
    A constant can be overridden by a constant with the same datatype.


Así que:

Si la clase MyListBox tuviese su método:


Public Sub Add(valor As String, pos As Integer)
  ...
End
 


Como ves, tiene el mismo número de parámetros o argumentos, pero con otros nombres y mismo nombre de método que la clase nativa.
Es totalmente funcional y no da problemas. Pero, ¿ que interés tendría eso ?.
¿ Nombres de argumentos que se le hagan más fácil al programador ?.  
¿ Hacer luego una conversión de tipos de datos en el interior del método ?.

Citar:

A method must be overridden by a method with exactly the same signature (same arguments datatypes, same return value datatype if any).


Saludos
 




===================
Gambas Básico
"No es un bug, es una característica no documentada"
 
última edición por Shell el Miercoles, 11 Abril 2018, 10:23; editado 2 veces 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Mostrar mensajes anteriores:    
 
OcultarTemas parecidos
Tema Autor Foro Respuestas último mensaje
No hay nuevos mensajes Método Alternativo Ninfus Bases de Datos 4 Domingo, 19 Diciembre 2010, 18:41 Ver último mensaje
Ninfus
No hay nuevos mensajes Cuestión Sobre Método De Una Clase.Borra... Shell General 8 Miercoles, 27 Febrero 2013, 05:50 Ver último mensaje
shordi
No hay nuevos mensajes Manejador, Método Shell General 3 Jueves, 02 Octobre 2014, 00:25 Ver último mensaje
Shell
No hay nuevos mensajes Ayuda Método De Tanteo Luisgr95 Aplicaciones/Fragmentos de Código 4 Sabado, 20 Octobre 2018, 11:24 Ver último mensaje
jsbsan
 

Publicar nuevo tema  Responder al tema  Página 1 de 1
 

Usuarios navegando en este tema: 0 registrados, 0 ocultos y 1 invitado
Usuarios registrados conectados: Ninguno


 
Lista de permisos
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas
No puede adjuntar archivos
Puede descargar archivos
No puede publicar eventos en el calendario



  

 

cron