Cambiar Algo Que Gambas Hace Por Defecto Al Ejecutar Una Instrucción


Objetivo: Cambiar Algo Que Gambas Hace Por Defecto Al Ejecutar Una Instrucción
Buenas!.

Cuando ejecutamos.

print objeto


Nos suele mostrar:

Citar:

(Clase dirección de memoria)


Me gustaría cambiar ese comportamiento. Mi idea es que en vez de hacer eso, me muestre lo que yo le diga.
Quiero que convierta el objeto a una cadena.

En Python existe el método especial __str__()
En Java existe el método ToString()

Si el método _str_ no se sobrescribe en Python ocurre algo parecido a Gambas.
( Mostraría clase y referencia en memoria ).

En Java es algo parecido a su manera.

En gambas tengo la opción de usar el método especial _call que actúa como una función
y devuelve un valor. Sobrescribiría el método _call, pero entonces, tengo que llamarlo como una función.

print objeto()


Naturalmente también podría crear en gambas el método ToString...pero estaría en la misma situación.
objeto.método().

¿ Hay alguna posibilidad de cambiar ese comportamiento ?.

Tenemos la clase Object con el método call, todavía más larga la instrucción.

Object.Call(objeto, "método").

Referencias:

Aprende a utilizar el método toString() en Java

Método especial __str__ en Python

Saludos

última edición por Shell el Sabado, 21 Marzo 2020, 12:15; editado 1 vez
Objetivo: Re: Cambiar Algo Que Gambas Hace Por Defecto Al Ejecutar Una Instrucción
Shell escribió: [Ver mensaje]
Mi idea es que en vez de hacer eso, me muestre lo que yo le diga.
Quiero que convierta el objeto a una cadena.

No entiendo lo que quieres.

Perfil MP  
Objetivo: Re: Cambiar Algo Que Gambas Hace Por Defecto Al Ejecutar Una Instrucción
Vuott:

Citar:

No entiendo lo que quieres.


Pues que si hago:

Public Sub Main()

Dim b1, b2 As Bombilla

b1 = New Bombilla

b1.encender

' Para usar el método call se tiene que usar como una función
'Print ("b1: " & b1())

Print b1() 'Esto es lo que no quiero hacer
Print b1 ' Esto es lo que quiero hacer

End


Y en vez de mostrarme:

Citar:

(Bombilla 0x55dff4bc0f18)


Me muestre esto:

Citar:

encendida


Para ello he tenido que sobrescribir el método especial _call del código de la clase bombilla.

Public Sub _call() As String

Dim est As String

If estado() Then
est = "encendida"
Else
est = "apagada"
Endif

Return est

End


No quiero llamarlo como a una función o método.

Saludos

Objetivo: Re: Cambiar Algo Que Gambas Hace Por Defecto Al Ejecutar Una Instrucción
Perdona, puedes dejar la metáfora y dar un ejemplo práctico y real?

Perfil MP  
Objetivo: Re: Cambiar Algo Que Gambas Hace Por Defecto Al Ejecutar Una Instrucción
Vuott:

Citar:

Perdona, puedes dejar la metáfora y dar un ejemplo práctico y real?


¿ Qué no entendiste del ejemplo anterior ?. Es un "ejercicio real", solo que es para el lenguaje Java.
Quiero conseguir (si es posible) hacer algo en gambas de (la misma forma) que en Java o Python.

...
Print b1() 'Esta es la forma o manera que no quiero hacerlo para conseguir el resultado
Print b1 ' Esta es la forma que quiero hacerlo para conseguir el resultado


Puedo mostrarte el ejercicio resuelto en Java:

Clase Bombilla.

public class Bombilla {

private boolean interruptor;
public static boolean integeneral = true;

public Bombilla() {
interruptor = false;
}

public boolean getestado() {
return interruptor;
}

public void encender() {
interruptor = true;
}

public void apagar() {
interruptor = false;
}

public boolean estado() {
boolean est = false;
if (integeneral == true && interruptor == true) {
est = true;
} else {
est = false;
}
return est;
}

public String toString() {
String estado;

if (estado() == true) {
estado = "encendida";
} else {
estado = "apagada";
}
return estado;
}
}


Código que usa la clase Bombilla.

public class PruebaBombilla {

public static void main(String[] args) {
Bombilla b1, b2;

b1 = new Bombilla();
b2 = new Bombilla();

b1.encender();
b2.apagar();

System.out.println("b1: " + b1);
System.out.println("b2: " + b2);

Bombilla.integeneral = false;
System.out.println("\nCortamos la luz general");
System.out.println("b1: " + b1);
System.out.println("b2: " + b2);

Bombilla.integeneral = true;
System.out.println("\nActivamos el interruptor general");
System.out.println("b1: " + b1);
System.out.println("b2: " + b2);
}

}


Salida:

Citar:

b1: encendida
b2: apagada

Cortamos la luz general
b1: apagada
b2: apagada

Activamos el interruptor general
b1: encendida
b2: apagada


Busco la forma en gambas de que al imprimir el objeto bombilla, ya sea b1 o b2, no me muestre una dirección de memoria del objeto.
Como eso es el procedimiento habitual de gambas, tengo que buscar una forma alternativa. Pero gambas usa en este caso
esta forma:

print b1()


En este caso, el método _call de gambas entraría en funcionamiento y "mostraría" lo que quiero, pero "no"
de la misma forma que hace en "Java". Quiero averiguar si es posible hacerlo de la misma forma que en Java.

Tan solo es eso.

Saludos


Página 1 de 1


  
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

   

Está utilizando la versión (Lo-Fi). Para ver la versión completa del foro, haga clic aquí.

Powered by Icy Phoenix based on phpBB
Design by DiDiDaDo

Página generada en:: 0.475s (PHP: -68% SQL: 168%)
Consultas SQL: 45 - Debug off - GZIP Activado