c# - oriented - ¿Hay alguna forma de llegar a un miembro "protegido" de otro objeto desde un tipo derivado?
object oriented concepts c# (5)
A una propiedad protegida solo se puede acceder a una instancia de una clase derivada, no a instancias de clases derivadas.
Existe una diferencia y tiene sentido, los miembros protegidos no deberían renunciar a su valor a ninguna otra instancia, incluso una instancia derivada del mismo tipo.
(Editado, tengo un poco de lengua atada!)
class MyBase
{
protected object PropertyOfBase { get; set; }
}
class MyType : MyBase
{
void MyMethod(MyBase parameter)
{
// I am looking for:
object p = parameter.PropertyOfBase; // error CS1540: Cannot access protected member ''MyBase.PropertyOfBase'' via a qualifier of type ''MyBase''; the qualifier must be of type ''MyType'' (or derived from it)
}
}
¿Hay alguna manera de obtener una propiedad protegida de un parámetro de un tipo de un tipo que se extiende sin reflexión? Dado que la clase que se extiende se sabe de la propiedad a través de su tipo base, tendría sentido si es posible.
Creo que deberías preguntarte si hay una forma mejor de hacer lo que quieres hacer. Desea que PropertyOfBase actúe como público en el contexto de MyType.MyMethod (), pero para estar protegido en todas las demás situaciones. ¿Por qué?
Hay una buena razón por la que no puedes hacer esto. Supongamos que alguien escribe:
class Other : MyBase { }
new MyType().MyMethod(new Other());
Si el lenguaje permite lo que está solicitando, puede violar las invariantes supuestas de Other
modificando el valor de PropertyOfBase
.
No, no puedes hacer esto.
Solo se le permite acceder a miembros protegidos de objetos del tipo de acceso (o derivados de él). Aquí, no sabemos si el parámetro es de tipo MyType o SomeOtherCompletelyDifferentType.
EDITAR: El bit relevante de la especificación C # 3.0 es la sección 3.5.3:
Cuando se accede a un miembro de instancia protegida fuera del texto de programa de la clase en la que se declara, y cuando se accede a un miembro de instancia interna protegido fuera del texto de programa del programa en el que se declara, el acceso debe tener lugar dentro de una clase declaración que deriva de la clase en la que se declara. Además, se requiere que el acceso tenga lugar a través de una instancia de ese tipo de clase derivada o un tipo de clase construido a partir de ella. Esta restricción impide que una clase derivada acceda a miembros protegidos de otras clases derivadas, incluso cuando los miembros se heredan de la misma clase base.
La última vez que me enfrenté a un problema similar, utilicé la solución de agregar un método estático protegido a la base:
class MyBase
{
protected object PropertyOfBase { get; set; }
protected static object GetPropertyOfBaseOf(MyBase obj)
{
return obj.PropertyOfBase;
}
}
class MyType : MyBase
{
void MyMethod(MyBase parameter)
{
object p = GetPropertyOfBaseOf(parameter);
}
}