2

给定这个界面

public interface IMyInterface
{
    string Method1();
}

为什么这是有效的

public sealed class InheretedFromInterfaceSealed: IMyInterface
{
    public string Method1()
    {
        return null;
    }
}

但这不是

public class InheretedFromInterfaceWithSomeSealed: IMyInterface
{
    public sealed string Method1()
    {
        return null;
    }
}

然而,对于抽象类来说,这是一个有效的场景

public abstract class AbstractClass
{
    public abstract string Method1();
}
public class InheretedFromAbstractWithSomeSealed: AbstractClass
{
    public sealed override string Method1()
    {
        return null;
    }
}
4

3 回答 3

6

因为默认情况下,每个方法都是密封的,除非它是虚拟的,或者除非你没有说sealed已经是虚拟的并且你正在覆盖的东西。

于 2010-12-15T07:08:54.407 回答
1

默认情况下,类中的每个方法都是密封的(NotOverridable在 VB.NET 中),除非您明确将其声明为virtualOverridable在 VB.NET 中)。

正如您所说,课程并非如此。您必须明确指出要禁止使用sealed(或NotInheritable在 VB.NET 中)从类继承。

于 2010-12-15T07:12:27.507 回答
0

只是提醒一下,C# 中的接口方法不能是sealed.

考虑以下代码:

interface IFoo
{
    void Bar();
}
class Base : IFoo
{
    public void Bar() { Console.WriteLine("Base.Bar"); }
}
class Derived : Base, IFoo
{
    public new void Bar() { Console.WriteLine("Derived.Bar"); }
}

然后,如果我们有var d = new Derived(),我们将有:

  • d.Bar()Derived.Bar
  • ((Base)d).Bar()Base.Bar
  • ((IFoo)d).Bar()Derived.Bar
  • ((IFoo)(Base)d).Bar()Derived.Bar

接口方法Bar被派生类覆盖。那个方法sealed不是接口方法,而是一个方法Base

也就是说,一个隐式实现

class ImplicitImpl : IFoo
{
    public void Bar() { Blah; }
}

应被视为以下语义等价的显式实现:

class ImplicitImplEquiv : IFoo
{
    public void Bar() { Blah; }
    void IFoo.Bar() { this.Bar(); }
}

如果一个派生类ImplicitImplEquiv简单地隐藏public void Bar在另一个public void Bar中,调用((IFoo)ref).Bar()仍然会调用ImplicitImplEquiv.Bar. 但是如果派生类也重新继承IFoo并提供新的实现,则接口 vtable 将不同于ImplicitImplEquiv.

于 2017-08-05T14:25:00.120 回答