Pregunta

En una clase base tengo esta propiedad:

public virtual string Text 
{
    get { return text; }
}

Quiero anular eso y devolver un texto diferente, pero también me gustaría poder configurar el texto, así que hice esto:

public override string Text
{
    get { return differentText; }
    set { differentText = value; }
}

Sin embargo, esto no funciona. Aparece un Squiggly rojo debajo de set que dice que no puedo anularlo porque no tiene un descriptor de acceso. ¿Por qué es esto un problema? ¿Qué debo hacer?

¿Fue útil?

Solución

En su segundo bloque de código está creando un método de conjunto público, pero la palabra "anular" en la declaración hace que el compilador busque un método con la misma firma en la clase base. Como no puede encontrar ese método, no le permitirá crear su conjunto.

Como dice ArsenMkrt, puede cambiar su declaración base para contener un conjunto protegido. Esto le permitirá anularlo, pero como todavía no podrá cambiar la firma, no podrá promocionar este método al público en su subclase, por lo que el código que publicó aún no funcionará.

En su lugar, necesita agregar un método de conjunto virtual público a su clase base que no haga nada (o incluso arroje una excepción si intenta llamarlo) pero esto va en contra de lo que un usuario de la clase esperaría comportamiento para que sea así si haces esto (y no lo recomendaré) asegúrate de que esté tan bien documentado que el usuario no lo pueda perder:

///<summary>
///Get the Text value of the object
///NOTE: Setting the value is not supported by this class but may be supported by child classes
///</summary>
public virtual string Text 
{
    get { return text; }
    set { }
}

//using the class

BaseClass.Text = "Wibble";
if (BaseClass.Text == "Wibble")
{
    //Won't get here (unless the default value is "Wibble")
}

De lo contrario, declare el conjunto como un método separado en su clase secundaria:

public override string Text
{
    get { return differentText; }
}

public void SetText(string value)
{
    differentText = value;
}

Otros consejos

public virtual string Text 
{
    get { return text; }
    protected set {}
}

cambie la propiedad de la clase base de esta manera, está intentando anular el método set que no existe

Desea que se expongan más capacidades al usar un tipo secundario. Parece que no quieres anular, quieres sombrear. Simplemente use la nueva palabra clave para ocultar la propiedad de Texto de solo lectura debajo de su propiedad de lectura / escritura.

En la clase base:

protected string text;
public string Text 
{
    get { return text; }
}

En clase derivada:

new public string Text 
{
    get { return text; }
    set { text = value; }
}

Es un problema porque está rompiendo la encapsulación. No puede anular algo y hacerlo más accesible, eso arrojaría todo sobre la encapsualización por la ventana.

Esa es la regla y también se aplica en su caso, aunque en realidad está exponiendo algo que no es el valor original.

No hay forma de hacer exactamente lo que intentaste. Debe crear un setter en la clase base o utilizar un método diferente para establecer el nuevo valor.

Puede ocultar la propiedad de la clase base:

public new string Text
{
    get { return differentText; }
    set { differentText = value; }
}

Pero en ese caso, esa propiedad solo se utilizará al manipular el objeto a través de una variable de este tipo, no el tipo base

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top