La única manera en que podía pensar es que la sombra de la propiedad con una nueva:
public class DerivedClass : BaseClass
{
int intValue;
public new int MyProperty
{
get { return intValue; }
set { intValue = value; }
}
}
Aviso cómo la propiedad se declara new
en lugar de override
. Esto significa, por supuesto, que MyProperty
del tipo DerivedClass
no tiene nada que ver con MyProperty
del tipo , es una propiedad completamente nueva que tiene el mismo nombre (por lo tanto, oculta la de la clase base).
El resultado es este:
DerivedClass d = new DerivedClass();
d.MyProperty = 42;
BaseClass b = new DerivedClass();
b.MyProperty = 42; /* compilation error: Property or indexer
'TheNamespace.BaseClass.MyProperty'
cannot be assigned to -- it is
read only */
También, como estados @silky en el comentario:
(aunque yo sugiero que lo hace, y el padre , se refieren a la misma variable a evite una situación muy confusa) pero Realmente no creo que esto sea sea apropiado.
... es posible que desee que la nueva propiedad acceda a la de la clase base (a través de base.MyProperty
, completada con un setter protegido). Considere lo siguiente, por ejemplo:
DerivedClass d = new DerivedClass();
d.MyProperty = 42;
BaseClass b = d;
Console.WriteLine(b.MyProperty); // prints 1
Dicho esto, siempre me siento un poco sucio cuando se utiliza new
(que, cuando pienso en ello, no estoy seguro de que realmente he hecho en código de producción).
actualización
Dado el escenario de ejemplo que das (que interpreto de una manera que un Parent
es ser capaz de establecer el RestrictionLevel
de un Child
), que podría resolverse de esta manera:
public enum RestrictionLevel
{
Low,
Medium,
Grounded
}
public class Person
{
public RestrictionLevel RestrictionLevel { get; private set; }
protected static void SetRestrictionLevelInternal(Person person, RestrictionLevel restrictionLevel)
{
person.RestrictionLevel = restrictionLevel;
}
}
public class Child : Person { }
public class Parent : Person
{
public void SetRestrictionLevel(Child child, RestrictionLevel restrictionLevel)
{
SetRestrictionLevelInternal(child, restrictionLevel);
}
}
Esto significa que el código siguiente es válido:
Child c = new Child();
Parent p = new Parent();
p.SetRestrictionLevel(c, RestrictionLevel.Grounded);
...pero éste no es:
Child c = new Child();
c.SetRestrictionLevel(c, RestrictionLevel.Low);
El método SetRestrictionLevelInternal
se puede llamar desde dentro cualquier tipo descendiente (incluyendo Child
), pero no se puede invocar desde fuera del tipo en sí. Por lo tanto, no puede invocar SetRestrictionLevelInternal
en una instancia Parent
. En el ejemplo anterior, elegimos exponer un método public
, que a su vez invoca el método protected
.
Enlace cruzado: http://stackoverflow.com/questions/1489361/override-abstract-readonly-property-to-read-write-property – Mikhail
Just needed to this para detener una referencia readlyly a un objeto que se actualiza indirectamente . Gracias por preguntar las preguntas antes de necesitar la respuesta. –