|
Página 1 de 1
|
Sobrescribir Un Método De Una Clase
Autor |
Mensaje |
Shell
Analista Programador
Registrado: Marzo 2010
Mensajes: 5278
Edad: 53 Ubicación: Al otro lado de la pantalla
|
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í:
Lo que me resulta algo extraño con lo grande que puede ser la clase Paint de gambas.
Hacer esto:
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"
|
#1 Lunes, 09 Abril 2018, 12:34 |
|
|
Shell
Analista Programador
Registrado: Marzo 2010
Mensajes: 5278
Edad: 53 Ubicación: Al otro lado de la pantalla
|
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
|
#2 Lunes, 09 Abril 2018, 12:51 |
|
|
Shell
Analista Programador
Registrado: Marzo 2010
Mensajes: 5278
Edad: 53 Ubicación: Al otro lado de la pantalla
|
Re: Sobrescribir Un Método De Una Clase
Aunque yo haga esto:
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
|
#3 Lunes, 09 Abril 2018, 13:02 |
|
|
Shell
Analista Programador
Registrado: Marzo 2010
Mensajes: 5278
Edad: 53 Ubicación: Al otro lado de la pantalla
|
Re: Sobrescribir Un Método De Una Clase
¿ Cual es el motivo de que esto no sea posible ?.
Esto es funcional con ListBox:
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 ?.
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
|
#4 Lunes, 09 Abril 2018, 13:45 |
|
|
jsbsan
Analista Programador
Registrado: Septiembre 2009
Mensajes: 4175
Edad: 51 Ubicación: dos hermanas, sevilla
|
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
|
#5 Lunes, 09 Abril 2018, 20:41 |
|
|
Shell
Analista Programador
Registrado: Marzo 2010
Mensajes: 5278
Edad: 53 Ubicación: Al otro lado de la pantalla
|
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.
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
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: |
23 veces |
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: |
23 veces |
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: |
23 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
|
#6 Martes, 10 Abril 2018, 08:48 |
|
|
jsbsan
Analista Programador
Registrado: Septiembre 2009
Mensajes: 4175
Edad: 51 Ubicación: dos hermanas, sevilla
|
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..
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: |
26 veces |
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: |
26 veces |
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: |
26 veces |
|
#7 Martes, 10 Abril 2018, 20:52 |
|
|
Shell
Analista Programador
Registrado: Marzo 2010
Mensajes: 5278
Edad: 53 Ubicación: Al otro lado de la pantalla
|
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:
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
|
#8 Miercoles, 11 Abril 2018, 10:19 |
|
|
|
Temas parecidos
Temas parecidos
|
Página 1 de 1
|
Usuarios navegando en este tema: 0 registrados, 0 ocultos y 1 invitado Usuarios registrados conectados: Ninguno
|
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
|
|
|
|
|