¿Por qué se permite cambiar la visibilidad y la existencia de getters o setters en una propiedad cuando se implementa una interfaz?Agregando setters a las propiedades en overrides
interface IFoo
{
string Bar { get; }
}
class RealFoo : IFoo
{
public RealFoo(string bar)
{
this.Bar = bar;
}
public string Bar { get; private set; }
}
class StubFoo : IFoo
{
public string Bar { get; set; }
}
... y no es legal hacer lo mismo al implementar una clase abstracta?
abstract class AbstractFoo : IFoo
{
public abstract string Bar { get; }
}
class RealFoo : AbstractFoo
{
public RealFoo(string bar)
{
this.Bar = bar;
}
// Cannot override because 'Bar' does not have an overridable set accessor
public override string Bar { get; private set; }
}
En su ejemplo, está * agregando * código a la implementación de la interfaz, ya que no existía un setter, pero está * cambiando * la visibilidad en la implementación de la clase abstracta. Entonces no es lo mismo. – jv42
@ jv42 No se cambia la visibilidad en la implementación porque el colocador es * privado *. La restricción es arbitraria y tonta ... C# podría especificarse también para permitir que la anulación solo se aplique para obtener o establecer cuando no sean privados. O podría permitir 'public string Bar {anular get; conjunto privado; } ' –
@JimBalter Estoy de acuerdo en que podría haber mecanismos para cambiar la visibilidad de los usuarios. Es posible que desee comprobar lo que viene en C# 6, he visto algunas cosas nuevas interesantes para las propiedades. – jv42