Estoy tratando de crear una clase abstracta que defina una propiedad con un getter. Quiero dejarlo en las clases derivadas para decidir si quieren implementar un setter para la propiedad o no. es posible?¿Propiedad abstracta con getter público, define el setter privado en la clase concreta posible?
Lo que tengo hasta ahora:
public abstract class AbstractClass {
public abstract string Value { get; }
public void DoSomething() {
Console.WriteLine(Value);
}
}
public class ConcreteClass1 : AbstractClass {
public override string Value { get; set; }
}
public class ConcreteClass2 : AbstractClass {
private string _value;
public override string Value {
get { return _value; }
}
public string Value {
set { _value = value; }
}
}
public class ConcreteClass3 : AbstractClass {
private string _value;
public override string Value {
get { return _value; }
}
public void set_Value(string value) {
_value = value;
}
}
En ConcreteClass1
, me sale un error en el set
. No puede anular set_Value
porque no existe ningún acceso de conjunto invalidado en AbstractClass.
En ConcreteClass2
, aparece un error en ambos Value
porque ya se ha declarado un miembro con el mismo nombre.
ConcreteClass3
no da error, pero aunque el acceso de conjunto de Value se compilaría en set_Value, no funciona al revés. Definir un set_Value
no significa que Value
obtiene un acceso de conjunto. Por lo tanto, no puedo asignar un valor a una propiedad ConcreteClass3.Value. I puede utilizar ConcreteClass3.set_Value ("valor"), pero eso no es lo que estoy tratando de lograr aquí.
¿Es posible que la clase abstracta exija un getter público, mientras que permite definir un setter opcional en una clase derivada?
En caso de que se lo pregunte, esta es solo una pregunta teórica. No tengo una situación real en la que se necesite algo como esto. Pero puedo imaginar una clase abstracta a la que no le importe cómo se establece una propiedad, pero que necesita ser capaz de obtener la propiedad.
Usando la 'interfaz', no puedo implementar el método' DoSomething' en mi clase base (no hay una clase base, solo una interfaz). Usar 'SetValue' es lo mismo que' set_Value' en mi 'ConcreteClass3'. Pero si ese es el camino a seguir, nombrarlo 'SetValue' es probablemente mejor que' set_Value'. – comecme
El motivo set_Value no está vinculado a la propiedad si hay una definición explícita de 'PropertyDef' en el ensamblado que vincula los métodos' get_' y 'set_'; simplemente nombrar un método 'set_' no lo vincula a una propiedad. No hay forma de hacer exactamente lo que quieres en C#; Tendrás que comprometerte. – thecoop
Puede implementar 'DoSomething' como método de extensión en' IInterface'. Ver mi edición – piedar