Definir Propiedades O Atributos De Un Objeto


Subject: Definir Propiedades O Atributos De Un Objeto
Buenas!.

Aunque el ejemplo no está terminado. Se me presenta la siguiente duda:

- Crear el objeto desde _new en una clase, dándole unos valores al constructor para instanciarlo.
- Crear y definir las propiedades del objeto desde otro lugar

Comencemos por lo segundo. Era lo que estaba usando en el ejemplo hasta hoy.
Bien. El motivo de hacer publicas las variables supongo que era para que lo reconociera en otro lugar.
En realidad estaba usando Me y el nombre de la variable dentro de la misma clase.. (al igual que una propiedad)

Anteriormente yo hacia esto para definir donde se debe dibujar un cuadrado en una rejilla creada sobre un DrawingArea.

Public x As Integer
Public y As Integer
Public ancho As Integer
Public alto As Integer
Private tipo As String

Public Sub _new(cx As Integer, cy As Integer, iancho As Integer, ialto As Integer, jugador As String)

x = cx
y = cy
ancho = iancho
alto = ialto
tipo = jugador

End


La creación de la celda o marca se hacía de esta forma:

Public Sub CrearCelda(cx As Integer, cy As Integer, jugador As String)
Dim celda As ClaseCelda

'Creo aquí la ficha para que una vez creada, haga el refresco del area de dibujo
'Es en la clase rejilla donde se conoce el tamaño que va a tener una ficha
'Ya que depende de las dimensiones de la rejilla o TABLERO

cx = cx \ tcelda
cy = cy \ tcelda

If Not existemarca[cx, cy] Then
existemarca[cx, cy] = True
celda = New ClaseCelda(cx, cy, tcelda, tcelda, jugador)
gceldas.Add(celda)
Else
Message.Info("Celda ya seleccionada")
Endif

Me.Refresh

End


Al cambiar y usar propiedades en vez de variables privadas o públicas , la clase puede quedar de esta forma:



El método de creación de la celda cambia su código quedando así:

Public Sub CrearCelda(cx As Integer, cy As Integer, sjugador As String)

Dim celda As ClaseCelda

'Creo aquí la ficha para que una vez creada, haga el refresco del area de dibujo
'Es en la clase rejilla donde se conoce el tamaño que va a tener una ficha
'Ya que depende de las dimensiones de la rejilla o TABLERO

cx = cx \ tcelda
cy = cy \ tcelda

If Not existemarca[cx, cy] Then
existemarca[cx, cy] = True
celda = New ClaseCelda
With celda
.x = cx
.y = cy
.alto = tcelda
.ancho = tcelda
.jugador = sjugador
End With
gceldas.Add(celda)
Else
Message.Info("Celda ya creada anteriormente")
Endif

Me.Refresh

End


Ahora no existe un constructor en la clase y se define las propiedades desde otro lugar.
Cuando uso propiedades. ¿ Debería usar un constructor o es mejor definir las propiedades del objeto desde otro lugar ?.

Saludos

Subject: Re: Definir Propiedades O Atributos De Un Objeto
El efecto final es el mismo. Quiero decir que los pasos que el compilador da son los mismos. Es cuestión de gustos más que nada.
Yo suelo utilizar el segundo método y dejar el _new() para establecer los valores por defecto.

Saludos.

Profile PM  
Subject: Re: Definir Propiedades O Atributos De Un Objeto
El problema que me encuentro es que si uso variables privadas y el constructor, al salir de la clase no se reconoce el objeto,
solo lo haría dentro de la clase. Y se debería declarar como públicas las variables de la clase para que se reconozcan en otro modulo.

A menos que quieras tener propiedades y a la vez el constructor en la misma clase y desde este asignar los valores a las propiedades.
¿ Te refieres mejor a eso ?.

Saludos

Subject: Re: Definir Propiedades O Atributos De Un Objeto
Por ejemplo. Usando variables privadas en la clase Celda, se llama a crear el objeto desde la clase Rejilla.
Ya supones los valores que devuelve....na.

Public Sub CrearCelda(cx As Integer, cy As Integer, jugador As String)
Dim celda As ClaseCelda

'Creo aquí la ficha para que una vez creada, haga el refresco del area de dibujo
'Es en la clase rejilla donde se conoce el tamaño que va a tener una ficha
'Ya que depende de las dimensiones de la rejilla o TABLERO

cx = cx \ tcelda
cy = cy \ tcelda

If Not existemarca[cx, cy] Then
existemarca[cx, cy] = True
celda = New ClaseCelda(cx, cy, tcelda, tcelda, jugador)
gceldas.Add(celda)
Else
Message.Info("Celda ya seleccionada")
Endif

Me.Refresh

End


Saludos

Subject: Re: Definir Propiedades O Atributos De Un Objeto
Si veo el array de celdas creadas puedo ver esto:

arraydeobjetosceldas

Pero si quiero ver ese elemento me va a mostrar:

vacio

Eso usando variables privadas y el constructor.

Saludos

Last edited by Shell on Sunday, 30 October 2016, 14:49; edited 1 time in total
Subject: Re: Definir Propiedades O Atributos De Un Objeto
Uno de los principios de la POO es que "Lo que pasa en las Vegas, se queda en las Vegas". Es decir, nunca , nadie, pero nunca, oiga, puede ver y menos aún toquetear mis variables. Para eso se han inventado las propiedades. La definición de tu clase celda debiera ser ésta,más o menos:

Te la pongo con el método que la dibujaría:

Inherits DrawingArea

Property x As Integer
Property y As Integer
Property ancho As Integer
Property alto As Integer

Private $tipo As String
Private $x As Integer
Private $y As Interger
Private $ancho As Integer
Private $alto As Integer


Public Sub _new(Optional cx As Integer, Optional cy As Integer, Optional iancho As Integer, Optional ialto As Integer, Optional jugador As String)

If cx Then
$x = cx
Endif
If cy Then
y = cy
Endif
If iancho Then
$ancho = iancho
Endif
If ialto Then
$alto = ialto
Endif
If $jugador Then
tipo = jugador
Endif

End

Public Sub Draw()

'aquí pintas la celda en el sitio en que indiquen las propiedades

End

Private Function x_Read() As Integer

Return $x

End

Private Sub x_Write(Value As Integer)

$x = value

End

Private Function y_Read() As Integer

Return $y

End

Private Sub y_Write(Value As Integer)

$y = value

End

Private Function ancho_Read() As Integer

Return $ancho

End

Private Sub ancho_Write(Value As Integer)

$ancho = value

End

Private Function alto_Read() As Integer

Return $alto

End

Private Sub alto_Write(Value As Integer)

$alto = value

End


Last edited by shordi on Sunday, 30 October 2016, 18:34; edited 1 time in total
Profile PM  
Subject: Re: Definir Propiedades O Atributos De Un Objeto
Shordi:

Citar:

Uno de los principios de la POO es que "Lo que pasa en las Vegas, se queda en las Vegas". Es decir, nunca , nadie, pero nunca, oiga, puede ver y menos aún toquetear mis variables. Para eso se han inventado las propiedades


Efectivamente, eso es lo que preguntaba. En este caso los parámetros no pueden ser opcionales ya que son necesarios para
dibujar la celda.

Saludos

Subject: Re: Definir Propiedades O Atributos De Un Objeto
Citar:
Efectivamente, eso es lo que preguntaba. En este caso los parámetros no pueden ser opcionales ya que son necesarios para

Confundes las cosas. Lo que es opcional es "el paso del parámetro en _new()", no la propiedad.
Nada te impide hacer

dim c as new celda 'crear una instancia de una clase no es dibujarla
with c
.x=10
.y=10
.ancho=20
.alto=20
end with
c.draw()

o
dim c as new celda(10,10,20,20,)
c.draw()

El paso del valor es opcional para la creación, como ves.

Last edited by shordi on Sunday, 30 October 2016, 20:37; edited 1 time in total
Profile PM  
Subject: Re: Definir Propiedades O Atributos De Un Objeto
Citar:

Confundes las cosas. Lo que es opcional es "el paso del parámetro en _new()", no la propiedad.


Cierto, todo el constructor entero es opcional.

Subject: Re: Definir Propiedades O Atributos De Un Objeto
Citar:
Cierto, todo el constructor entero es opcional.

No si quieres hacer software de calidad. Uno de los objetivos de la POO es "blindar" la clase contra errores. El constructor tiene mucho que ver en eso. Es la oportunidad de inicializar valores, levantar flags, etc. etc. antes de que la cosa se ponga en marcha. Así con éste constructor:
Public Sub _new(Optional cx As Integer, Optional cy As Integer, Optional iancho As Integer, Optional ialto As Integer, Optional jugador As String)

If cx Then
$x = cx
else
$x=0
Endif
If cy Then
y = cy
else
$y=0
Endif
if iancho then
$ancho=iancho
else
$ancho=10
endif
if ialto then
$alto=ialto
else
$alto=10
endif
etc..

Tienes las tres posibilidades: Crear la celda pasando parámetros en la misma línea. Crear la celda y luego pasarle los valores o crear la celda y dejar que se dibuje sola
Si eliminas el constructor ¿cómo vas a pasar los valores a las variables internas del control? Eso es convertir la clase en una función...

Hay otra posibilidad: Imagina que las celdas, por defecto, son cuadradas, aunque te reservas el derecho de hacerlas rectangulares. Entonces:

Public Sub _new(Optional cx As Integer, Optional cy As Integer, Optional iancho As Integer, Optional ialto As Integer, Optional jugador As String)

If cx Then
$x = cx
else
$x=0
Endif
If cy Then
y = cy
else
$y=0
Endif
if iancho then
me.ancho=iancho 'aquí cambia la cosa al colocar me. disparas el evento ancho_write
else
me.ancho=10 'aquí también
endif
if ialto then
me.alto=ialto 'lo mismo que para el ancho
else
me.alto=10
endif
etc..
etc..
end
Private sub ancho_write(Value as integer)
$ancho=Value
if $alto=0 then $alto=$ancho
end
Private sub alto_write(Value as integer)
$alto=Value
if $ancho=0 then $ancho=$alto
end


Así te aseguras que las celdas sean cuadradas, cuando mínimo solo con pasar uno de los valores.
El constructor es importante...

Saludos

Last edited by shordi on Monday, 31 October 2016, 11:32; edited 1 time in total
Profile PM  

Page 1 of 1


  
You cannot post new topics
You cannot reply to topics
You cannot edit your posts
You cannot delete your posts
You cannot vote in polls
You cannot attach files
You can download files
You cannot post calendar events

   

This is a "Lo-Fi" version of our main content. To view the full version with more information, formatting and images, please click here.

Powered by Icy Phoenix based on phpBB
Design by DiDiDaDo

Generation Time: 0.1508s (PHP: 2% SQL: 98%)
SQL queries: 26 - Debug Off - GZIP Enabled