2011-03-18 13 views
10

En MSDN, he encontrado que es un error utilizar el modificador "virtual" en una declaración de método abstracto. Uno de mis colegas, que debe ser bastante experimentado desarrollador, aunque usos esto en su código:Declaración de método abstracto - virtual?

public abstract class BusinessObject 
{ 
    public virtual void Render(){} 
    public virtual void Update(){} 
} 

También correcta o no?

Respuesta

4

Estos no son métodos abstractos, son vacíos por defecto. La diferencia es que NO TIENES que anularlos (si no lo haces, no pasará nada).

que podría ayudar a su comprensión a verlos formateado como:

public abstract class BusinessObject 
{ 
    public virtual void Render() 
    { 

    } 

    public virtual void Update() 
    { 

    } 
} 
+0

Ah, claro, también no puedo usar la palabra clave virtual si tenían un cuerpo, ¿verdad? – Mocco

+0

@Mocco: * tienen * un cuerpo, está vacío. Los métodos no pueden ser 'virtuales' * sin * un cuerpo. –

+0

si no hay cuerpo, no pueden ser virtuales. Si hay un cuerpo, no pueden ser abstractos –

9

Puede tener sentido si la clase abstracta está proporcionando un punto de opcional, donde las clases heredadas pueden cambiar el comportamiento.

De esta manera las clases heredadas no se forzarán para implementarlo, pero pueden hacerlo si lo necesitan.

Por lo general, este método es llamado por la clase abstracta:

public AddFoo(Foo f) 
{ 
    // ... 
    OnAddedFoo(f); 
} 

Aquí tiene sentido tener OnAddedFoo como virtual y no abstract.

5

supongo que la MSDN significa que no puede utilizar el modificador virtual y abstract en un métodoal mismo tiempo.

Puede hacerlo

public virtual void Render() {} 

lo que significa que una clase que hereda puede reemplazar este método.

O puede hacer

public abstract void Render(); 

lo que significa que una clase que hereda debe reemplazar este método.

2

Es probable que se refieren a esta frase

No puede utilizar el modificador virtual con la estática, abstracta, privada o modificadores de anulación.

Esto significa que no puede usar esto en la declaración del método un método no puede ser al mismo tiempo virtual y abstracto.

Así que el uso que ha presentado está bien, porque la clase es abstracta, esto significa que puede tener algunos métodos abstractos (sin implementación que debe implementarse por clase secundaria) y método virtual (con implementación que puede ser anulado en la clase de niños).

0

código follwing significa que necesidad ovveride este método en la clase heredada y no se puede poner un poco de lógica en el cuerpo del método abstracto:

public abstract void Render(); 

Pero si se declara método virtual se puede poner un poco de lógica en el interior y puede ovveride

public virtual void Render() 
{ 
    // you can put some default logic here  
} 
Cuestiones relacionadas