C#学习笔记之密封类与密封方法

发布时间:2019-11-28编辑:脚本学堂
本文介绍下,有关C#的密封类与密封方法的相关知识,有需要的朋友,参考下吧。

1,使用关键字sealed,声明的类不能继承,声明的方法不能重写。相当于Java中的final关键字。

2,定义如下
① 密封类的定义
 

复制代码 代码示例:
sealed class myClass 

     
    } 
     
    //下面的定义在编译时会报错 
    class myChildClass : myClass  
    { 
         

② 密封方法的定义
 

复制代码 代码示例:
class myClass 

        public virtual void OnlyForMe() 
        { 
     
        } 
    } 
     
    //下面的方法OnlyForMe被定义为密封方法 
    class myChildClass : myClass  
    { 
        //非重写方法不可密封 
        public sealed override void OnlyForMe() 
        { 
     
        } 
    } 
     
    //报错 【继承成员“继承.myChildClass.OnlyForMe()”是密封的,无法进行重写】 
    class myGrandSon : myChildClass 
    { 
        public override void OnlyForMe() 
        { 
     
        } 
    } 

3,密封类一般用于不希望第三方扩展类的情况下。.NET基类库就大量使用了密封类。比如string就是一个密封类。

在C#中,为了确保其他类不可以派生于某一类,可以使用sealed关键字密封该类,对某个类使用 sealed关键字作为前缀,这样可以防止其他类继承自该类,例如:
 

复制代码 代码示例:
public sealed class Square:Rectangle{}

下面的语句将导致产生错误:
 

复制代码 代码示例:
///---Error:Square is sealed---
public class Rhombus:Square
{}

密封类中不能包含虚方法(Virtual)和抽象方法(abstract),因为在密封的类没有为派生类提供实现其虚方法和抽象方法的机会。

也可以使用密封方法,从而其他派生类不可以重写在当前类中提供的实现,如
 

复制代码 代码示例:
public class Rectangle:Shape 

  public override double Area() 
  { 
     return this.length*this.width; 
  } 

为了防止Rectangle的派生类(如Square)修改Area()实现,可使用sealed 关键字作为该方法的前缀,如:
 

复制代码 代码示例:
public class Rectangle:Shape 

   public override sealed double Area() 
   { 
       return this.length*this.width; 
   } 

现在,如果尝试重写Square类中的Area()方法,会产生错误:
 

复制代码 代码示例:

public class Square:Rectangle 

    ///---Error:Area() is sealed in Rectangle class---    
    public override  double Area() 
    { 
       ///具体实现 
   } 
}

就是

这些了,C#学习笔记之C#的密封类与密封方法,希望结大家有所帮助。