Consulta sobre Contraseña

18/03/2005 - 09:30 por Pedro Rivera | Informe spam
La situación es la siguiente: Estoy desarrollando un
conjunto de clases que se transmitirán información entre
sí. Actualmente he declarado estas clase como no
heredables, aunque la verdad yo quisiera implementarlas
como interfaces o como clases heredables.

La razón de hacerlas no heredables es que casi todas las
propiedades de las clases serán de solo lectura, solo una
de lectura-escritura, y tendrán un método que se podrá
usar solo una vez al crearlas. Después de creadas, ya no
podrá volverse a utilizar este método, que es el que les
pasará la información a las propiedades de la clase.

Después de creadas la clases (al decir creadas me refiero
a instanciarlas y hacer el archivo con su extensión), una
de ellas, "Clase2", debe escribir en la propiedad de
lectura-escritura de las otras clases ("Clase3"
y "Clase4"), pero SOLO ESTA CLASE puede escribir en esa
propiedad, es decir, no quiero que haya forma de escribir
en esa propiedad de las otras clases más que a través
de "Clase2". Por ejemplo, si yo declaro una nueva
instancia de "Clase2" y hago:

Dim Cl2 as new Clase2
Cl2.PropiedadLectEscr=Objeto

la propiedad no cambia. Para lograr esto, he declarado la
propiedad de forma tal, que para poder escribir el valor,
se le deba pasar un parámetro a la propiedad (como con la
propiedad item de un arrayList). Este parámetro es una
cadena que solo la "Clase2" conoce, y por lo tanto
solo "Clase2" puede acceder al método Set de la propiedad
(la función Get no ocupa el parámetro).

Después de este rollo (posiblemente innecesario, solo que
traté de clarificarlo) mi pregunta es: ¿Es posible que
alguien de alguna manera: a) Logre extraer ese parámetro
b) acceder al método Set de la propiedad?

Si la respuesta es que no se puede, ¿de qué otra forma
puedo lograr esta misma seguridad trabajando con
Interfaces o con una clase heredable?

Saludos a todos y Gracias.

Preguntas similare

Leer las respuestas

#1 Eduardo A. Morcillo [MS MVP VB]
18/03/2005 - 13:52 | Informe spam
Si no entendi mal, lo que buscas se resuelve con un constructor con
parametros y propiedades de solo lectura. Ejemplo:

Class MiClase

Private _propiedad As String

Public Sub New(propiedad As String)
_propiedad = propiedad
End Sub

Public ReadOnly Property MiPropiedad As String
Get
Return _propiedad
End Get
End Property

End Class

Siendo asi, solo al crear la instancia puedes asignarle un valor a la
propiedad: Dim obj As New MiClase("El Valor")

Si las instancias de esta clase solo las puede crear otra clase del mismo
proyecto entonces cambia el constructor de Public a Friend.

De todas formas usando Reflection es posible acceder al campo "_propiedad"
pese a ser privado y modificar su valor, pero hacer eso requiere de mas
trabajo.

Eduardo A. Morcillo [MS MVP VB]
http://www.mvps.org/emorcillo
https://mvp.support.microsoft.com/p...4EF5A4191C
Respuesta Responder a este mensaje
#2 Pedro Rivera
19/03/2005 - 06:29 | Informe spam
Siempre se aprende algo nuevo contigo Morcillo. La
respuesta a mi duda me la das casi totalmente en el
último párrafo: "usando Reflection es posible acceder al
campo "_propiedad" pese a ser privado y modificar su
valor". Digo casi, porque el valor que trato de ocultar
no es un campo, es un parámetro y solo existe dentro del
método Set de la propiedad Lectura-Escritura:

Public Property Propiedad(byval clave as string) as string
Get
return Cadena
End get
Set(byval value as string)
if clave="Algo" then
cadena=value
end if
End set
end property

Bueno, aquí me estoy dando cuenta que he cometido un
error y no lo he explicado bien; lo que quiero ocultar no
es exactamente el parámetro, sino el valor al que se
compara, es decir, la cadena "Algo", ¿Es posible que
alguien se de cuenta de que la cadena con la que
comparo "Clave" es "Algo"?
En caso de que también se pueda acceder a ese valor
(aunque sea solo leerlo), deberé modificar las
propiedades y hacerlas todas de lectura-escritura.

En cuanto a lo primero, efectivamente, pude haberlo hecho
sobrecargando el constructor.


Si no entendi mal, lo que buscas se resuelve con un


constructor con
parametros y propiedades de solo lectura. Ejemplo:

Class MiClase

Private _propiedad As String

Public Sub New(propiedad As String)
_propiedad = propiedad
End Sub

Public ReadOnly Property MiPropiedad As String
Get
Return _propiedad
End Get
End Property

End Class

Siendo asi, solo al crear la instancia puedes asignarle


un valor a la
propiedad: Dim obj As New MiClase("El Valor")

Si las instancias de esta clase solo las puede crear


otra clase del mismo
proyecto entonces cambia el constructor de Public a


Friend.

De todas formas usando Reflection es posible acceder al


campo "_propiedad"
pese a ser privado y modificar su valor, pero hacer eso


requiere de mas
trabajo.

Eduardo A. Morcillo [MS MVP VB]
http://www.mvps.org/emorcillo
https://mvp.support.microsoft.com/p...73D2-BD48-


4197-A380-104EF5A4191C


.

Respuesta Responder a este mensaje
#3 Eduardo A. Morcillo [MS MVP VB]
19/03/2005 - 07:10 | Informe spam
Bueno, aquí me estoy dando cuenta que he cometido un
error y no lo he explicado bien; lo que quiero ocultar no
es exactamente el parámetro, sino el valor al que se
compara, es decir, la cadena "Algo", ¿Es posible que
alguien se de cuenta de que la cadena con la que
comparo "Clave" es "Algo"?



Puede llegar a verse si descompilas el componente. Pero de todas formas con
reflection puedes acceder a "cadena" (el campo que contiene el valor de la
propiedad) sin pasar por la propiedad, lo que significa que puedes de todas
formas asignarle un valor sin necesidad de saber la clave.

Eduardo A. Morcillo [MS MVP VB]
http://www.mvps.org/emorcillo
https://mvp.support.microsoft.com/p...4EF5A4191C
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida