Duda elemental en un módulo y en una clase

07/01/2005 - 12:02 por sirtim | Informe spam
Si defino una función dentro de un módulo, puedo acceder a ella desde otros
objetos sin problema:

public module A
public function prueba ()
prueba="hola"
end function
end module

Si desde otro sitio consulto la función prueba, no tengo problemas
De hecho, sin el "public" también me funciona.

Sin embargo, si hago lo mismo con una clase:

public class B
public function cosa ()
cosa = "hola otra vez"
end function
end class

Cuando intento utilizar "cosa" me dice "la referencia a un miembro no
compartido requiere una referencia de objeto"

Alguien me puede dar una ayudita?

Preguntas similare

Leer las respuestas

#1 Carlos Fouz
07/01/2005 - 13:19 | Informe spam
para una clase tienes k hacer un objeto (una instancia de una clase por
definicion)

prueba esto :

dim objB as new B()
B.Cosa()

asi deberia funcionar

"sirtim" escribió:

Si defino una función dentro de un módulo, puedo acceder a ella desde otros
objetos sin problema:

public module A
public function prueba ()
prueba="hola"
end function
end module

Si desde otro sitio consulto la función prueba, no tengo problemas
De hecho, sin el "public" también me funciona.

Sin embargo, si hago lo mismo con una clase:

public class B
public function cosa ()
cosa = "hola otra vez"
end function
end class

Cuando intento utilizar "cosa" me dice "la referencia a un miembro no
compartido requiere una referencia de objeto"

Alguien me puede dar una ayudita?



Respuesta Responder a este mensaje
#2 Leonardo Azpurua
07/01/2005 - 15:04 | Informe spam
"sirtim" escribió en el mensaje
news:unV%
Si defino una función dentro de un módulo, puedo acceder a ella desde
otros objetos sin problema:

public module A
public function prueba ()
prueba="hola"
end function
end module

Si desde otro sitio consulto la función prueba, no tengo problemas
De hecho, sin el "public" también me funciona.

Sin embargo, si hago lo mismo con una clase:

public class B
public function cosa ()
cosa = "hola otra vez"
end function
end class

Cuando intento utilizar "cosa" me dice "la referencia a un miembro no
compartido requiere una referencia de objeto"

Alguien me puede dar una ayudita?



Hola, Sirtim:

Al final, cuando pasas de VB a IL (el lenguaje de la "maquina virtual" de
.net) los módulos tambien se convierten en clases.

Entonces te cuento sobre los estaticos de las clases, y como funcionan.

De entrada, hay que tener claro que las clases no son las cosas, sino
patrones que sirven como base para construir cosas, lo que hacemos mediante
la palabra clave New.

Sin embargo, es posible declarar, dentro de una clase, variables o funciones
que son comunes a todas las instacias de una clase. Eso lo hacemos mediante
el modificador Shared (compartido).

Por ejemplo:

Public Class MiClase
Public Shared ValorComun As Byte
Public ValorLocal As Int16;
End Class

ValorComun existe *en la clase* y es el mismo para todas las instancias de
la clase. Por ejemplo:

Sub Main()
Dim mc1 As New MiClase, mc2 As New MiClase
mc1.ValorComun = 7
Console.WriteLine("mc1={0}; mc2={1}", mc1.ValorComun,
mc2.ValorComun)
' ambas instancias tienen 7
MiClase.ValorComun = 12
' fijate que asignamos directamente a la clase
Console.WriteLine("mc1={0}; mc2={1}", mc1.ValorComun,
mc2.ValorComun)
' todas las instancias de la clase tendran 12
' incluso las que creemos posteriormente\
End Sub

Lo que interesa de todo este largo asunto es que los miembors de clase, que
se declaran con el atributo Shared, pueden accederse mediante una referencia
a la clase.

Cuando haces un modulo, lo que realmente haces es una clase cuyos atributos
son, tras bastidores, declarados como Shared.

Cuando en el encabezado de un archivo fuente escribes Imports XXXX, siendo
XXXX una referencia a una clase, todos los miembros compartidos publicos de
esa clase son accesibles desde el archivo sin cualificacion. Es decir, si en
otro archivo del mismo proyecto escribes "Imports MiClase" podras escribir
cosas como "ValorComun = 7" en lugar de "MiClase.ValorComun = 7".

Cuando haces un módulo, se genera una directiva a nivel de proyecto que
causa la importación implicita a todos los archivos de las clases generadas
por los módulos.

De modo que al final, en .net, todo son clases.

Alguien te sugerirá que no utilices módulos, porque "son la negación de la
OO". No les hagas caso: los modulos son clases compuestas por miembros
estáticos importadas a nivel de proyecto: que se vayan a teorizar al baño.

Salud!
Respuesta Responder a este mensaje
#3 Leonardo Azpurua
07/01/2005 - 15:52 | Informe spam
"Leonardo Azpurua" <l e o n a r d o (arroba) m v p s (punto) o r g> escribió
en el mensaje news:
Alguien te sugerirá que no utilices módulos, porque "son la negación de la
OO". No les hagas caso: los modulos son clases compuestas por miembros
estáticos importadas a nivel de proyecto: que se vayan a teorizar al baño.



Por otra parte, cuando el compilador encuentra un simbolo no cualificado al
procesar el código fuente, debe "resolver" dicho simbolo. Para ello busca en
cada referencia importada si incluye un simbolo igual y compatible con el
que está resolviendo.

Entonces, a mayor cantidad de referencias importadas, mayor cantidad de
búsquedas y mayor tiempo de compilación.

De manera que un uso exagerado de modulos puede producir un aumento notable
en el tiempo de compilación.

Salud!
Respuesta Responder a este mensaje
#4 sirtim
07/01/2005 - 16:53 | Informe spam
Muchísimas gracias a todos.
Me siento un poco estúpido por mi pregunta. Estoy empezando con .NET y
estaba tan abrumado con tantas cosas nuevas que me he despistado.
Gracias especialmente a Leonardo por la generosidad en las explicaciones. He
aprendido cosas nuevas.
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida