2012-06-10 25 views
7

Sono sicuro che dichiarare un metodo abstract lo rende automaticamente virtuale?I metodi astratti sono virtuali?

Cioè, in sottoclassi posso sovrascriverlo molte volte e in fase di esecuzione, verrà chiamato il metodo corrispondente al tipo di runtime dell'oggetto?

È possibile dichiarare un metodo astratto non virtuale? Cioè, il metodo che deve essere implementato in una sottoclasse non astratta e non può essere sovrascritto?

+0

possibile duplicato di [È ogni funzione astratta virtuale in C#, in generale?] (Http://stackoverflow.com/questions/391557/is-every-abstract-function-virtual-in-c-in-general) –

risposta

8

Sì, abstract methods are virtual per definizione; essi devono essere override per poter effettivamente essere sovrascritto dalle sottoclassi:

Quando una dichiarazione metodo di istanza include un modificatore abstract, tale metodo è detto essere un metodo astratto. Anche se un metodo astratto è implicitamente anche un metodo virtuale, non può avere il modificatore virtual.

Al contrario non è possibile dichiarare un metodo astratto non virtuale, perché se si potesse, si avrebbe un metodo che non può essere implementato e quindi non può mai essere chiamato, rendendolo piuttosto inutile.

Tuttavia, se si vuole avere una classe implementa un metodo astratto, ma non consente alcuna delle sue sottoclassi di modificare la sua attuazione, è lì che sealed viene in Un esempio:.

abstract public class AbstractClass 
{ 
    abstract public void DoSomething(); 
} 

public class BaseClass : AbstractClass 
{ 
    public sealed override void DoSomething() 
    { 
     Console.WriteLine("Did something"); 
    } 
} 

Si noti che mentre l'astratto il metodo è (implicitamente) virtuale, l'implementazione nella classe base concreta non è virtuale (a causa della parola chiave sealed).

1

Sì, sono virtuali. Altrimenti non avresti modo di scrivere l'implementazione per loro.

Problemi correlati