2009-06-23 111 views
5

比方说,我有以下代码:C#继承

interface ISomeInterface 
{ 
    void DoSomething(); 
    void A(); 
    void B();  
} 

public abstract class ASomeAbstractImpl : ISomeInterface 
{ 
    public abstract void A(); 
    public abstract void B(); 
    public void DoSomething() 
    { 
     // code here 
    } 
} 

public class SomeImpl : ASomeAbstractImpl 
{ 
    public override void A() 
    { 
     // code 
    } 

    public override void B() 
    { 
     // code 
    } 
} 

的问题是,我希望有ASomeAbstractImpl.DoSomething()方法密封(最终),所以没有其他的类都可以实现它。 由于代码现在SomeImpl可能有一个名为DoSomething()的方法,可以调用它(它不会覆盖与抽象类名称相同的方法,因为它没有标记为虚拟),但我想切断在SomeImpl类中实施这种方法的可能性。

这可能吗?

回答

9

C#中的方法默认是封闭的。然而,没有什么可以做来防止方法隐藏(在派生类中暴露一个名称相同的方法,通常使用new)。

或者,对于这个问题,接口重新实现:

static void Main() 
{ 
    ISomeInterface si = new EvilClass(); 
    si.DoSomething(); // mwahahah 
} 

public class EvilClass : ASomeAbstractImpl, ISomeInterface 
{ 
    public override void A() {} 
    public override void B() { } 
    void ISomeInterface.DoSomething() 
    { 
     Console.WriteLine("mwahahah");    
    } 
} 
2

所有方法默认情况下密封的,但没有阻止会员隐藏的方式。

无论何时隐藏成员,C#编译器都会发出编译器警告,但除此之外,您无法阻止它。

+5

只有在您意外操作时才会发出警告;添加“新”限定符,它关闭... – 2009-06-23 07:31:55

0

如果SomeImpl类包含DoSemthing方法,这意味着它隐藏了原始一个不越权。

0

当处理接口和抽象类时,更多的是关于你必须做什么,而不是你不能做什么。因此,您可以让接口用户知道这些是他们必须实现的方法,并且您可以使用关键字虚拟关键字来让他们知道可以覆盖某个方法。但是你不能阻止他们做太多事情。即使您有意不使用虚拟关键字,他们仍然可以用关键字隐藏它。