2011-06-17 11 views
20

Tengo una clase con una subclase. La superclase tiene una propiedad Position. La subclase debe realizar una operación adicional cuando se cambia la propiedad Position, por lo que estoy intentando anular el método setter y llamar al setter de la superclase.¿Cómo anulo el método setter de una propiedad en C#?

Creo que tengo la parte llamada setter de superclase, pero no puedo entender cómo funciona la sintaxis primordial aquí.

Aquí es mi mejor intento: code

El captador es allí sólo para la prueba de concepto - supongamos que se quiere anular eso también?

El getter y setter me dan errores de esta forma: 'superClassName.Position [GS] y'

miembro de

no puede anular heredado, ya que no está marcado virtual, abstracto o anulan

Aquí hay una screencap de los errores demasiado buena medida: errors

también he intentado usar la palabra clave override frente al set. Eliminar el getter superfluo no tiene ningún efecto.

¿Cuál es la sintaxis correcta?

+0

También tenga en cuenta que se está reemplazando el comprador, si el propósito del código era utilizar la posición de clase de base y llamar SnapBodyToPos() cuando una se establece el valor, también tiene que cambiar el "obtener" para "devolver la base.Posición" en lugar de "devolver la posición" –

Respuesta

33

La anulación está bien. Sin embargo, como el mensaje de error indica, tiene que marcar la propiedad en la clase base como virtual para poder anularlo:

public virtual Vector2 Position 

diferencia de Java, miembros de la clase no son virtuales por defecto en C#. Si no puede cambiar la clase base, no tiene suerte.

+1

Sí, eso es lo que me atrapó. Estoy haciendo C# pero pensando en Java. ¡Gracias! – Anko

4

en su clase base: añadir palabras clave virtual

2

No se puede reemplazar miembros no marcadas como virtual o abstract

Marque su propiedad Vector2 en una superclase como virtual.

public virtual Vector2 Position 
6

Su propiedad Position no es virtual en la clase base, por lo que no puede anularlo. Si lo haces virtual, deberías poder anularlo.

se pone un poco desordenado anulando un bit sin el otro - no es el tipo de cosa que hago muy a menudo, así que tendría que jugar un rato con él para asegurarse de lo que está pasando, pero el primera cosa que hacer sería cambiar la propiedad de la clase base ...

Esto también es exactamente lo que el mensaje de compilador le está diciendo:

no puede anular miembro heredada 'superClassName.Position.[GS] y' porque no está marcado virtual, abstracto o anular

que te está diciendo algo acerca de la propiedad de la clase base - así que eso es lo que hay que cambiar para anularlo. Los mensajes del compilador están ahí para ayudar: ¡preste mucha atención a ellos!

4

El problema se señala a usted en el mensaje de error :)

No se puede reemplazar a los miembros que no son virtuales (o abstracto) en el primer lugar.

Su superclase necesita tener virtual en la definición de la propiedad:

public virtual Vector2 Position { ... } 
Cuestiones relacionadas