none
¿Cómo puedo inicializar esta clase para referenciarla de la manera siguiente? RRS feed

  • Pregunta

  • Suponiendo que tengo esta clase:

    Public MiClase
       Private UnCampo As UnTipo
    
       Sub New(Parametro As UnTipo)
          UnCampo = Parametro
       End Sub
    
       Public Shared Sub Metodo1()
          ....
          ....
       End Sub
    
    
       Public Shared Sub Metodo2()
          ....
          ....
       End Sub
    End Class
    Como los métodos están compartidos – declarados con Shared  podría hacer esto (en otra clase):

    Dim MiObjeto As New MiClase("Aqui el parámetro")

    Y luego, para referenciar a los métodos:

    MiObjeto.Metodo1

    MiObjeto.Metodo2

    Entiendo que si le quito el Shared en la declaración de los métodos, podría hacer esto (en otra clase):

    IMPORTS MiClase

    Y referenciar a los métodos en el cuerpo de dicha clase, directamente así:

    Método1

    Método2

    La consulta es la siguiente: Deseo referenciar la clase creada de la segunda forma, el problema es que no sé dónde le pongo el parámetro del constructor (del método Sub New).

    ¿Se puede usar la clase como en la segunda forma especificándole un parámetro al constructor?





    domingo, 9 de junio de 2019 8:34

Respuestas

  • Y si la clase no tuviera métodos compartidos (o sea, sino estuvieran declarados como Shared), para acceder a ellos tendría que usar directamente la clase, así: Clase.Metodo y la consulta es: ¿En ese caso cómo podría pasarle el parámetro?

    No se puede. Si los métodos no son Shared, entonces no puedes llamarlos como Clase.Metodo. El compilador te dará un error. Solo los puedes llamar a través de una instancia. Y entonces el parámetro se lo pasas al constructor en el momento de crear la instancia.
    • Marcado como respuesta James2016-2 lunes, 10 de junio de 2019 1:07
    domingo, 9 de junio de 2019 20:57
  • Deleted
    • Marcado como respuesta James2016-2 lunes, 10 de junio de 2019 1:07
    domingo, 9 de junio de 2019 23:44
  • los metodos compartidos se usan para ejecutar instruciones sin la necesidad de crear una instancia de la clase y ejecutarlos desde otra clase simplemente llamando al metodo directamente pongamos un ejemplo la clase SerialPort  necesita de un nombre de un puerto COM como muchas veces uno  no sabe que puerto esta usando la pc ya sea el puerto Com1, com2 etc esa clase tiene una funcion que se llama GetPortNames() esta es Shared y lo que hace es retornarnos todos los puertos COM que estan en la pc de este modo se hace menos tedioso estar buscando a ver cuales son los puertos de la computadora entonces una ves que tengamos el nombre del puerto COM ya le pasamos ese nombre como parametro a la clase SerialPort mira un ejemplo

            Dim name As String = SerialPort.GetPortNames(0)
            
            Dim sp As New SerialPort(name)
    
            Try
                sp.Open()
            Catch ex As Exception
                Console.WriteLine(ex.Message)
            End Try

    como ves se iso uso del metodo compartido para obtener un valor y luego pasarselo a la misma clase como parametro al instanciarla en si lo que hace un metodo compartido es lo mismo que uno que no sea compartido con la diferencia de que se puede usar en otras clases sin tener que instanciar la clase contenedora del metodo


    • Marcado como respuesta James2016-2 lunes, 10 de junio de 2019 1:08
    domingo, 9 de junio de 2019 23:46

Todas las respuestas

  • Deseo referenciar la clase creada de la segunda forma, el problema es que no sé dónde le pongo el parámetro del constructor (del método Sub New).

    No tiene sentido hacerlo. Los métodos estáticos ("Shared") se llaman directamente desde la clase sin hacer un New de la clase. Sí, en tu primer ejemplo has hecho un New de la clase antes de llamar al método Shared, pero es completamente superfluo. No sirve para nada hacer un New para instanciar la clase antes de llamar al Shared, dado que desde un método Shared no se puede acceder a ningún dato de instancia.

    domingo, 9 de junio de 2019 10:43
  • Hola buenos dias

    Si un mienbro de una clase esta declarado con la palabra clave Shared solo lo podras llamar directamente de este modo

    MiClase.Metodo1()

    si creas una instancia de la clase con New y intentas llamar el metodo el compilador te va mostrar una alerta indicandote que no es la forma correcta ya que el motodo en cuestion es compartido osea 'Shared', recuerda todos los mienbros compartidos de una clase ya sea un campo metodo etc  se llaman directamente desde la clase

    sin tener que crear una instancia de la clase, si todos los metodos de clase los vas a declarar como Shared te recomiendo mejor crear un modulo ya que automaticamente los miembros de un modulo son compartidos mira un ejemplo

    Public Module MiObjecto
    
        Private Campo1 As Integer = 2
        Private Campo2 As Integer = 3
    
        Sub MetodoSuma()
            Console.WriteLine("{0} + {1} = {2}", Campo1, Campo2, (Campo1 + Campo2))
        End Sub
    
        Sub MetodoResta()
            Console.WriteLine("{0} - {1} = {2}", Campo1, Campo2, (Campo1 - Campo2))
        End Sub
    
    End Module

    y llamas a los metodos de este modo

     MiObjecto.MetodoSuma()
     MiObjecto.MetodoResta()

    a si te evitas crear una clase y ponerle a todos los miembros de la clase la palabra clave Shared pero si lo que quieres es hacer algunos metodos como Shared y otros no entonces crea una clase y llama a los metodos normales atraves de una instancia de la clase y los metodos que con Shared llamalos directamente desde la clase ejemplos

    ejemplo uno llamando los metodos que no son Shared:

    Dim Mc as new MiClase()
    Mc.Metodo1
    Mc.Metodo2

    Ejemplo dos llamando a los metodos declarados con Shared

    MiClase.MetodoShared1
    MiClase.MetodoShared2
    
    'Como ves aqui no  necesitas instanciar la clase con New

    Saludos y buenos dias

    domingo, 9 de junio de 2019 11:49
  • Buenos día, gracias por la paciencia. Ah ya, estaba confundido o puse mal el ejemplo, si no entendí mal, cuando un método se declara como Shared, o sea compartido se puede hacer referencia directamente usando la misma clase y cuando no, hay que crear una instancia de la clase para poder invocarlos.

    Pero, dos consultas: He visto que se crea una clase en un contenedor, algo así:

    Public Classs UnaClase

        'Métodos de la clase (creo que declarados como Shared), para seguir el ejemplo, digamos:

    Public Shared Sub MetodoSuma()

    ...

    End Sub

    Public Shared Sub MetodoResta()

    ...

    End Sub

         

    End class

    Y luego, en otra clase, por ejemplo un formulario invocan a la clase así:

    IMPORTS UnaClase

    'Y luego invoncan los métodos u otros objetos que contenga UnaClase, directamente, por ejemplo:

    MetodoSuma

    MetodoResta

    Como se observa en ese caso no es necesario poner Unaclase.MetodoSuma, sino que al ponerlo en Imports se pueden invocar también directamente, es correcto?

    Y la otra pregunta:

    En el ejemplo para instanciar la clase:

    Dim Mc as new MiClase()


    Y si quisiera pasarle un parámetro a su constructor, sería así:

    Dim Mc as new MiClase(AquiElParámetro)

    Cuando uso directamente la clase, así: Clase.Metodo, la consulta es: ¿En ese caso cómo podría pasarle ese parámetro global que usarían varios objetos declarados en la clase?







    • Editado James2016-2 domingo, 9 de junio de 2019 22:46
    domingo, 9 de junio de 2019 20:37
  • Entiendo, como explica Dante, puse mal el ejemplo (lo puse al revés), si declaro como Shared no tiene sentido crear una instancia, puedo referenciarlo directamente, ok, mal preguntado.


    Con instancia: (suponiendo que los métodos de MiClase no sean declarados Shared), sería así

    Dim MiObjeto As New MiClase("Aqui el parámetro")

    Como se ve le paso un parámetro al instanciarlo.

    Lo que en realidad consulto es cómo le paso un parámetro a la clase en el otro escenario, o sea si es que sus métodos son shared, es decir si es que referencio a la clase directamente:

    MiClase.MiMetodo. Cómo haría para pasarle un parámetro a MiClase, antes de usar los objetos que pudiera tener declarados y que usan ese parámetro. (ojalá me haya dejado entender).









    • Editado James2016-2 domingo, 9 de junio de 2019 21:07
    domingo, 9 de junio de 2019 20:43
  • Y si la clase no tuviera métodos compartidos (o sea, sino estuvieran declarados como Shared), para acceder a ellos tendría que usar directamente la clase, así: Clase.Metodo y la consulta es: ¿En ese caso cómo podría pasarle el parámetro?

    No se puede. Si los métodos no son Shared, entonces no puedes llamarlos como Clase.Metodo. El compilador te dará un error. Solo los puedes llamar a través de una instancia. Y entonces el parámetro se lo pasas al constructor en el momento de crear la instancia.
    • Marcado como respuesta James2016-2 lunes, 10 de junio de 2019 1:07
    domingo, 9 de junio de 2019 20:57
  • Estoy confundiendo los términos, no es que no lo entienda. Obviemos lo otro.

    El punto es: Cuando referencio al método de la forma Clase.método, es decir cuando no declaro explícitamente una instancia cómo le pasaría un parámetro a la clase? o qué alternativa tendría. La tercera es la vencida :)


    • Editado James2016-2 domingo, 9 de junio de 2019 22:46
    domingo, 9 de junio de 2019 22:44
  • Deleted
    • Marcado como respuesta James2016-2 lunes, 10 de junio de 2019 1:07
    domingo, 9 de junio de 2019 23:44
  • los metodos compartidos se usan para ejecutar instruciones sin la necesidad de crear una instancia de la clase y ejecutarlos desde otra clase simplemente llamando al metodo directamente pongamos un ejemplo la clase SerialPort  necesita de un nombre de un puerto COM como muchas veces uno  no sabe que puerto esta usando la pc ya sea el puerto Com1, com2 etc esa clase tiene una funcion que se llama GetPortNames() esta es Shared y lo que hace es retornarnos todos los puertos COM que estan en la pc de este modo se hace menos tedioso estar buscando a ver cuales son los puertos de la computadora entonces una ves que tengamos el nombre del puerto COM ya le pasamos ese nombre como parametro a la clase SerialPort mira un ejemplo

            Dim name As String = SerialPort.GetPortNames(0)
            
            Dim sp As New SerialPort(name)
    
            Try
                sp.Open()
            Catch ex As Exception
                Console.WriteLine(ex.Message)
            End Try

    como ves se iso uso del metodo compartido para obtener un valor y luego pasarselo a la misma clase como parametro al instanciarla en si lo que hace un metodo compartido es lo mismo que uno que no sea compartido con la diferencia de que se puede usar en otras clases sin tener que instanciar la clase contenedora del metodo


    • Marcado como respuesta James2016-2 lunes, 10 de junio de 2019 1:08
    domingo, 9 de junio de 2019 23:46
  • Gracias por la explicación, gracias a todos.
    lunes, 10 de junio de 2019 1:08