2009-11-20 11 views
5
public abstract class A 
{ 
    public abstract void Process(); 
} 

public abstract class B : A 
{ 
    public abstract override void Process(); 
} 

public class C : B 
{ 
    public override void Process() 
    { 
     Console.WriteLine("abc"); 
    } 
} 

Questo codice genera un errore di compilazione: 'B' non implementa il membro astratto ereditato 'A.Process()'.Un metodo astratto sovrascrive un metodo astratto

C'è un modo per farlo?

+0

Perché vuoi? –

+0

Che cosa stai cercando di fare esattamente? Il tuo codice non ha molto senso ... –

risposta

13

Basta lasciare il metodo completamente in classe B. B lo eredita comunque da A, e poiché B stesso è astratto, non è necessario implementarlo di nuovo esplicitamente.

8

Funziona per me in VS2008; nessun errore, nessun avviso. MA, non c'è motivo di avere la 'sostituzione' in B. Questo codice è equivalente:

public abstract class A 
{ 
    public abstract void Process(); 
} 

public abstract class B : A 
{ 
} 

public class C : B 
{ 
    public override void Process() 
    { 
     Console.WriteLine("abc"); 
    } 
} 
3

Alon -

questo non ha senso. Prima di tutto, questo in realtà viene compilato correttamente. In secondo luogo, il metodo astratto si dichiarato in una è ereditaria (ancora abstract) in B. Pertanto, non avete bisogno di dichiarare Process() in classe B.

- Mark

3

Il posto dove vorrei' L'ho visto a volte sovrascrivere un metodo virtuale non astratto con un metodo astratto. Ad esempio:

public abstract class SomeBaseType 
{ 
    /* Override the ToString method inherited from Object with an abstract 
    * method. Non-abstract types derived from SomeBaseType will have to provide 
    * their own implementation of ToString() to override Object.ToString(). 
    */ 
    public abstract override string ToString(); 
} 

public class SomeType : SomeBaseType 
{ 
    public override string ToString() 
    { 
     return "This type *must* implement an override of ToString()"; 
    } 
} 
+0

Penso di sapere cosa intendi ma il tuo esempio non riflette quello che stai dicendo. Almeno dovresti aggiungere una classe SomeVeryBaseType con il metodo virtuale non astratto e lasciare SomeBaseType ereditare da SomVeryBaseType. –

+0

Per quei manichini che non sanno o ottengono quello ... come me –

+0

@Lieven: ho aggiunto un commento per chiarire che il metodo di base che viene sovrascritto qui è 'Object.ToString()'. –

Problemi correlati