2009-04-28 66 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 
    } 
} 
相关问题