2009-04-28 100 views
38

在C#中,是否有可能將重寫的虛擬方法標記爲最終的,以便實現者不能覆蓋它?我會怎麼做?是否有可能將最終覆蓋的方法標記爲

一個例子可能更容易理解:

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() { } 
} 

是否有修改的B爲了防止其他孩子C來自覆蓋DoAction的方式,無論是在編譯時或運行時?

回答

62

是,與 「密封」:

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

您可以將方法標記爲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

你可以在事實上 – annakata 2009-04-28 12:08:55

5

個人的方法可以作爲密封的,這是大致上相等於標記的方法作爲最終在Java被標記。因此,在您的例子中,你將有:

class B : A 
{ 
    override sealed void DoAction() 
    { 
    // implementation 
    } 
} 
相關問題