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:
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.?
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:
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:
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:
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
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:
Dim p As New Player("Pepito", 16, New Paisano)
Y mas adelante, cuando quieras cambiar la cateogira del personaje harias lo siguiente:
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)
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 :)
Sí, está fallando descaradamente, a ver si consigo arreglaro cuando tenga un momentillo... :-[
sync
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...
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)
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...