2009-04-28 9 views
38

In C#, è possibile contrassegnare un metodo virtuale sottoposto a override come finale in modo che gli implementatori non possano sovrascriverlo? Come lo farei?è possibile contrassegnare il metodo sottoposto a override come finale

Un esempio può rendere più facile da capire:

class A 
{ 
    abstract void DoAction(); 
} 
class B : A 
{ 
    override void DoAction() 
    { 
     // Implements action in a way that it doesn't make 
     // sense for children to override, e.g. by setting private state 
     // later operations depend on 
    } 
} 
class C: B 
{ 
    // This would be a bug 
    override void DoAction() { } 
} 

C'è un modo per modificare B, al fine di evitare che altri bambini C di ignorare DoAction, sia al momento della compilazione o di esecuzione?

risposta

62

Sì, con "sigillato":

class A 
{ 
    abstract void DoAction(); 
} 
class B : A 
{ 
    sealed override void DoAction() 
    { 
     // Implements action in a way that it doesn't make 
     // sense for children to override, e.g. by setting private state 
     // later operations depend on 
    } 
} 
class C: B 
{ 
    override void DoAction() { } // will not compile 
} 
8

È possibile contrassegnare il metodo come sealed.

http://msdn.microsoft.com/en-us/library/aa645769(VS.71).aspx

class A 
{ 
    public virtual void F() { } 
} 
class B : A 
{ 
    public sealed override void F() { } 
} 
class C : B 
{ 
    public override void F() { } // Compilation error - 'C.F()': cannot override 
           // inherited member 'B.F()' because it is sealed 
} 
+0

puoi rendere i singoli metodi sigillati infatti – annakata

+0

perché contrassegni la classe come sigillata? Puoi anche specificare questo modificatore a livello di metodo ... –

+0

Interessante Non ho mai saputo che potresti sigillare i metodi, ma non ho mai avuto motivo di farlo. –

5

metodi individuali può essere contrassegnato come sigillata, complessivamente equivalente a contrassegnare un metodo finale in Java. Quindi nel tuo esempio avresti:

class B : A 
{ 
    override sealed void DoAction() 
    { 
    // implementation 
    } 
} 
Problemi correlati