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

クラスのすべてのメソッドは、明示的に (VB.NET で)NotOverridable宣言しない限り、デフォルトで (VB.NET で) 封印されvirtualますOverridable

あなたが言ったように、これはクラスには当てはまりません。sealedを使用して(またはNotInheritableVB.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、呼び出しによって が呼び出されます。ただし、派生クラスも再継承して新しい実装を提供する場合、インターフェイスの vtable は のそれとは異なります。((IFoo)ref).Bar()ImplicitImplEquiv.BarIFooImplicitImplEquiv

于 2017-08-05T14:25:00.120 に答える