Hay algunos casos en los que el patrón que describes es justificable. Por ejemplo, puede ser útil tener una clase abstracta MaybeMutableFoo
, de la cual derivan los subtipos MutableFoo
y ImmutableFoo
. Las tres clases incluyen una propiedad IsMutable
y los métodos AsMutable()
, AsNewMutable()
y AsImmutable()
.
En esa situación, sería totalmente apropiado para el MaybeMutableFoo
exponer una propiedad de lectura-escritura, si su contrato especifica explícitamente que el colocador puede no funcionar a menos que IsMutable
devuelva verdadero. Un objeto que tenga un campo de tipo MaybeMutableFoo
que contenga una instancia de ImmutableFoo
podría estar perfectamente satisfecho con esa instancia a menos que o hasta que tuviera que escribir en ella, con lo cual reemplazaría el campo con un objeto devuelto por AsMutable()
y luego lo usaría como un foo mutable (sabría que era mutable, ya que simplemente lo había reemplazado).Tener MaybeMutableFoo
incluir un setter evitaría la necesidad de hacer futuros typecasts en el campo una vez que se hizo para referirse a una instancia mutable.
La mejor manera de permitir un patrón así es evitar la implementación de propiedades virtuales o abstractas, pero en su lugar implementar propiedades no virtuales cuyos captadores y establecedores se encadenan a métodos virtuales o abstractos. Si uno tiene una clase base
public class MaybeMutableFoo
{
public string Foo {get {return Foo_get();} set {Foo_set(value);}
protected abstract string Foo_get();
protected abstract void Foo_set(string value};
}
entonces una clase derivada ImmutableFoo
puede declarar:
new public string Foo {get {return Foo_get();}
para hacer su Foo
propiedad de solo lectura sin interferir con la capacidad de codificar las anulaciones por lo abstracto Foo_get()
y Foo_set()
métodos. Tenga en cuenta que el reemplazo de solo lectura de Foo
no cambia el comportamiento de la propiedad get; la versión de solo lectura encadena al mismo método de clase base que la propiedad de clase base. Hacer las cosas de esta manera asegurará que haya un punto de parche para cambiar el captador de propiedades, y otro para cambiar el colocador, y esos puntos de parche no cambiarán, incluso si la propiedad misma se redefine.
Necesitamos más contexto que pienso. – Noldorin