Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Duda con Polimorfismo en VB net

Iniciado por Hechelion, 05 de Febrero de 2010, 09:31:15 AM

« anterior - próximo »

Hechelion

Saludos.

Tengo una duda la cual no he logrado responder con google, tal vez porque no he podido describirla de forma correcta, así que solicito su ayuda.

Antecedentes:
Tengo una clase base, "ClsClaseJugador", la cual hereda en otras clases "ClsPaisano", "ClsGuerrero", "ClsHerrero", etc.
Tengo un Array para identificar a cada personaje del juego, por ejemplo:
Código (vb) [Seleccionar]
Dim Personajes(99) as ClsClaseJugador

'Y luego, creo el objeto según sea la clase, por ejemplo
Personaje(0) = New ClsPaisano
Personaje(1) = New ClsGuerrero


Durante el transcurso del juego, los personajes van a ir cambiando su clase, pero necesito que mantengan ciertos valores al hacer este cambio ¿Cual es la forma correcta de cambiar el tipo de objeto sin alterar los valores de las propiedades?,

me explico mejor con un pequeño ejemplo, supongamos que el personaje 0 es del tipo ClsPaisano y que tiene las siguientes propiedades:

Personaje(0).Nombre = "Pepito Palote"
Personaje(0).Fuerza = 16


Al llegar a cierto punto, necesito que ese personaje cambie su clase a ClsGuerrero, pero necesito que mantenga el mismo nombre y la misma fuerza, ¿Es correcto que haga Personaje(0) = New ClsGuerrero, aunque inicialmente lo haya creado como ClsPaisano?
¿Necesito hacer algo más.?

[EX3]

#1
En cuanto hagas un New te estas cargando toda la instancia anterior del objeto. Yo mas bien intentaria hacer algo mas "logico" para mi.

Si la idea es tener una clase base que pueda mutar a otras variantes usaria eso mismo, una clase base que defina todo los miembros comunes entre clases o categorias de personajes y un miembro de esta clase que sea de tipo iClase. iClase seria una interfaz que definiria la estructura obligatoria que deberian cumplir todas las caterogiras de personajes. De esta forma puedes definir tantas categorias de personajes como quieras (serian clases), mientras cumplan o implementen la interfaz iClase (o como la quieras llamar) la podras aplicar al miembro iClase de la clase base del jugador. Voy a intentar "visualizarlo":

Clase base del jugador:
Código (vbnet) [Seleccionar]
Public Class Player
   ' Devuelve el nombre del personaje:
   Private varName As String
   Public Property Name() As String
       Get
           Return varName
       End Get
       Set(ByVal value As String)
           varName = value
       End Set
   End Property

   ' Devuelve la fuerza del personaje:
   Private varForce As Integer
   Public Property Force() As Integer
       Get
           Return varForce
       End Get
       Set(ByVal value As Integer)
           varForce = value
       End Set
   End Property

   ' Devuelve o establece la categoria o clase del personaje:
   Private varCategory As iPlayerClass
   Public Property Category() As iPlayerClass
       Get
           Return varCategory
       End Get
       Set(ByVal value As iPlayerClass)
           varCategory = value
       End Set
   End Property

   Public Sub New()

   End Sub

   Public Sub New(ByVal Name As String, ByVal Force As Integer, ByVal Category As iPlayerClass)
       varName = Name
       varForce = Force
       varCategory = Category
   End Sub
End Class


Interfaz para definir categorias o clases de jugador:
Código (vbnet) [Seleccionar]
Public Interface iPlayerClass
   ReadOnly Property Weapon() As Object ' En vez de Object podria ser otra interfaz que defina una base para las clases de armas.
   ReadOnly Property Resistance() As Integer
   ReadOnly Property HasMagic() As Boolean
End Interface


Dos categorias de personajes:
Código (vbnet) [Seleccionar]
Public Class Paisano
   Implements iPlayerClass

   Public ReadOnly Property HasMagic() As Boolean Implements iPlayerClass.HasMagic
       Get
           Return False
       End Get
   End Property

   Public ReadOnly Property Resistance() As Integer Implements iPlayerClass.Resistance
       Get
           Return 200
       End Get
   End Property

   Public ReadOnly Property Weapon() As Object Implements iPlayerClass.Weapon
       Get
           Return Nothing ' No tiene arma.
       End Get
   End Property
End Class

Código (vbnet) [Seleccionar]
Public Class Guerrero
   Implements iPlayerClass

   Public ReadOnly Property HasMagic() As Boolean Implements iPlayerClass.HasMagic
       Get
           Return True
       End Get
   End Property

   Public ReadOnly Property Resistance() As Integer Implements iPlayerClass.Resistance
       Get
           Return 5000
       End Get
   End Property

   Private varWeapon As Object
   Public ReadOnly Property Weapon() As Object Implements iPlayerClass.Weapon
       Get
           Return varWeapon
       End Get
   End Property
End Class

Ahora el caso practico. Tu creas tu instancia del jugador, por ejemplo:
Código (vbnet) [Seleccionar]
Dim p As New Player("Pepito", 16, New Paisano)
Y mas adelante, cuando quieras cambiar la cateogira del personaje harias lo siguiente:
Código (vbnet) [Seleccionar]
p.Category = New Gerrero
El jugador sigue manteniendo su nombre y fuerza y ahora tiene las capacidades y propiedades de la categoria Gerrero.

Supongo que algo como esto estabas buscando hacer (eso si no me he meado fuera del tiesto  ^_^')

Salu2...

P.D.: Me lo parece o el GeSHi no esta funcionando? (el plugin de coloreado de sintaxis de codigo del foro)
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

tewe76

CitarP.D.: Me lo parece o el GeSHi no esta funcionando? (el plugin de coloreado de sintaxis de codigo del foro)
A mi me sale también sin colorear, por si sirve de algo :)
Tewe
www.TAPAZAPA.com : Funny and easy to play games for all ages! - Fairy Match - Brain Crash
www.LaRebelionDelBiberon.com : Experiencias de unos padres primerizos

synchrnzr

Sí, está fallando descaradamente, a ver si consigo arreglaro cuando tenga un momentillo... :-[

sync

[EX3]

Cita de: synchrnzr en 05 de Febrero de 2010, 02:01:47 PM
Sí, está fallando descaradamente, a ver si consigo arreglaro cuando tenga un momentillo... :-[
Yo te diria que no le dieras mucha prioridad, para 4 gatos que lo usamos de higos a brevas tampoco se va a echar demasiado en falta creo yo :P

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

Hechelion

#5
Efectivamente es eso que dices Ex3.
Gracias por la ayuda y voy a usar las interfaces como propones ;)

PD: ¿Cuando hago un NEW sobre una variable que ya tiene un objeto creado, VB se encarga sólo de liberar la memoria o es necesario hacer algo? (Asumo que el garbage de VB se encarga de eso)

[EX3]

En .NET es como Java, hasta que el recolector de basura no salga de paseo la memoria que ocupa tu objeto sigue estando ocupada (esto al menos al hacer un Nothing sobre la variable, lo que no tengo claro es si el operador New sobreescribe esa area de memoria o se busca otra libre).

Si quieres hacer una eliminacion mas directa busca informacion sobre la implementacion de la interfaz iDispose para implementar tus propios metodos de Dispose() (los destructores de clase en .NET), que son los metodos que tienen cantidad de objetos en .NET justamente para deshacerse de elementos no gestionados por el framework de .NET (objetos de la API de Windows, componentes ActiveX, etc...)

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.