C#中的密封方法

Moh*_*ar 35 c# sealed

我是C#的新手.我正在读关于密封的关键字.我有关于密封的类.我读了一条关于密封方法的线,我们也可以制作密封方法.线是(通过声明方法密封,我们可以避免进一步重写这个方法.)我已经创建了一个demo但是没有理解上面的行和密封方法的含义使用.以下是我的代码: -

using System;

namespace ConsoleApplication2
{
    class Program:MyClass
    {
        public override sealed void Test()
        {
            Console.WriteLine("My class Program");
        }
        static void Main(string[] args)
        {
            Program obj = new Program();
            obj.Test();
            Console.ReadLine();
        }
    }

    class MyClass
    {
        public virtual void Test()
        {
            Console.WriteLine("My class Test");
        }
    }


}
Run Code Online (Sandbox Code Playgroud)

请告诉我为什么我们使用密封方法以及密封方法的优点.

Eri*_*ert 72

密封是一个类,它不能是另一个派生类的基类.

未密封类中的密封方法是一种无法在此类的派生类中重写的方法.

为什么我们使用密封方法?密封方法有哪些优点?

那么,为什么要使用虚拟方法呢?提供可以自定义类的行为的点.那你为什么要使用密封方法呢?提供一个点,在该点保证,对于此方法,任何派生类的行为都不会发生进一步的更改.

可以定制类的行为的点是有用危险的.它们很有用,因为它们使派生类能够改变基类的行为.它们很危险......等待它... 因为它们使派生类能够改变基类的行为.虚拟方法基本上允许第三方让你的课程做你从未预料或测试过的疯狂事情.

我喜欢编写符合我预期和测试内容的代码.密封方法允许您继续允许类的部分被覆盖,同时使密封方法具有无法进一步定制的保证,可测试,稳定的行为.

  • 不错.当我的导师不知道它是什么时,我找到了答案 (2认同)

Meh*_*ari 71

好吧,你只使用两个级别的继承进行测试,并且你没有达到你"进一步覆盖"一个方法的程度.如果你做到三,你可以看到sealed:

class Base {
   public virtual void Test() { ... }
}
class Subclass1 : Base {
   public sealed override void Test() { ... }
}
class Subclass2 : Subclass1 {
   public override void Test() { ... } // Does not compile!
   // If `Subclass1.Test` was not sealed, it would've compiled correctly.
}
Run Code Online (Sandbox Code Playgroud)

  • 我可以用第一级作为接口来做到这一点吗? (2认同)

Jon*_*eet 21

好吧,如果你不希望任何派生类进一步覆盖你的方法,你只能在方法上使用"sealed" .默认情况下,方法是密封的,如果它们未被声明为虚拟方法而不是覆盖另一个虚方法.(在Java中,默认情况下方法是虚拟的 - 要实现"默认"C#行为,必须将方法标记为final.)

我个人喜欢仔细控制继承 - 我更喜欢在可能的情况下密封整个类.但是,在某些情况下,您仍希望允许继承,但请确保不会进一步覆盖某些方法.一种用途可能是有效地模拟方法,例如用于诊断:

public sealed override void Foo(int x)
{
    Log("Foo called with argument: {0}", x);
    FooImpl(x);
    Log("Foo completed");
}

protected abstract void FooImpl(int x);
Run Code Online (Sandbox Code Playgroud)

现在,子类不能Foo直接覆盖- 它们必须覆盖FooImpl,因此我们的行为将始终在其他代码调用时执行Foo.

当然,模板可能出于其他原因 - 例如强制执行参数验证的某些方面.

根据我的经验,密封方法并不经常使用,但我很高兴有能力.(我只是希望课程默认密封,但这是另一个对话.)