5

假设我有以下代码:

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

这可能吗?

4

5 回答 5

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");            
    }
}
于 2009-06-23T07:25:41.687 回答
2

默认情况下,所有方法都是密封的,但无法阻止成员隐藏。

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

于 2009-06-23T07:27:32.603 回答
0

默认情况下,未标记为虚拟的方法是密封的。在派生类中,您必须使用关键字new标记“覆盖”方法,否则您将收到编译器警告。如果超类的方法被标记为虚拟,您可以按密封覆盖对其进行密封。

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

于 2009-06-23T07:31:25.683 回答
0

如果 SomeImpl 类包含 DoSemthing 方法,这意味着它隐藏了未覆盖的原始方法。

于 2009-06-23T07:32:48.910 回答
0

When dealing with interfaces and abstract classes its more about what you MUST do and not what you cannot do. So you can let the interface user know that these are the methods they must implement and with your abstract classes you can use the virtual keyword to let them know its OK to override a method. However you can't stop them from doing too much. Even if you purposefully don't use the virtual keyword they can still hide it with the new keyword.

于 2009-06-23T07:35:11.730 回答