Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我们可以在类中声明密封的方法吗_C#_Oop_Overriding_Sealed - Fatal编程技术网

C# 我们可以在类中声明密封的方法吗

C# 我们可以在类中声明密封的方法吗,c#,oop,overriding,sealed,C#,Oop,Overriding,Sealed,上述代码中存在编译时错误: 无法密封X.F(),因为它不是重写 无法密封X.F1(),因为它不是重写 这是否意味着我们只能应用sealed关键字,而我们必须覆盖某些方法?好吧,sealed关键字可以防止方法被覆盖,这就是为什么它没有意义 使用虚拟声明-只需删除virtual,而不是声明virtual-sealed 在抽象方法上,因为必须重写抽象方法 在非虚拟方法上,因为这些方法不能被重写 因此,唯一的选项是覆盖密封,这意味着覆盖,但最后一次: 的MSDN条目似乎非常清楚。密封一个虚拟方法是没有意

上述代码中存在编译时错误:

无法密封X.F(),因为它不是重写

无法密封X.F1(),因为它不是重写

这是否意味着我们只能应用
sealed
关键字,而我们必须覆盖某些方法?

好吧,sealed关键字可以防止方法被覆盖,这就是为什么它没有意义

  • 使用虚拟声明-只需删除
    virtual
    ,而不是声明
    virtual-sealed
  • 在抽象方法上,因为必须重写抽象方法
  • 在非虚拟方法上,因为这些方法不能被重写
  • 因此,唯一的选项是
    覆盖密封
    ,这意味着覆盖,但最后一次:


    的MSDN条目似乎非常清楚。密封一个虚拟方法是没有意义的(为什么要使它虚拟,然后防止重写?)。密封一个“普通”方法也没有意义,因为默认情况下无论如何都不能覆盖它。这就留下了这样一个场景:您希望(并且确实)重写一个方法,但是说“任何从我继承的东西都不能再重写这个方法”。这就是密封覆盖的作用。你想用这段代码做什么?也许有不同的方法来实现你的目标。
    class X {
        sealed protected virtual void F() {
            Console.WriteLine("X.F");
        }
        sealed void F1();
        protected virtual void F2() {
            Console.WriteLine("X.F2");
        }
    }
    
    public class A {
      public virtual void SomeMethod() {;}
    
      public virtual void SomeOtherMethod() {;}
    }
    
    public class B: A {
      // Do not override this method any more
      public override sealed void SomeMethod() {;}
    
      public override void SomeOtherMethod() {;}
    }
    
    public class C: B {
      // You can't override SomeMethod, since it declared as "sealed" in the base class
      // public override void SomeMethod() {;}
    
      // But you can override SomeOtherMethod() if you want
      public override void SomeOtherMethod() {;}
    }