zoukankan      html  css  js  c++  java
  • c#中abstract、override、new、virtual、sealed使用

    abstract

        修饰类名为抽象类,修饰方法为抽象方法。如果一个类为抽象类,则这个类智能是其他某个类的基类。抽象方法在抽象类中没有函数体。抽象类中的抽象方法是没有方法体的,继承其的子类必须实现抽象类的抽象方法。

         抽象类有如下特征:

    • 抽象类不能实例化
    • 抽象类的派生类必须实现所有抽象方法
    • 抽象类中的抽象方法是没有方法体的,继承其的子类必须实现抽象类的抽象方法
     
    抽象方法:
    • 抽象方法是隐式的虚方法
    • 只允许在抽象类中使用抽象方法声明
    • 抽象方法在抽象类中没有方法体
    • 在抽象方法声明中,不能使用static或者virtual修饰符
    1. abstract class A //abstract 关键字在class前面  
    2.     public abstract void run();//方法是将关键字abstract 添加到方法的返回类型的前面  
     
    override
        override关键字提供派生类对基类方法的新的实现,重写的基类方法必须和基类的方法有着相同的签名(函数名、返回值、参数列表相同)。
        override关键字不可以重写基类非virtual修饰的方法和static修饰的静态方法。
        派生类的override方法和基类的virtual方法必须有相同的访问权限。不能用修饰符new、static、virtual或者abstract修饰override方法。
        派生类的override方法重写的基类方法必须是virtual、abstract或者override的。
     
         
    1. abstract class
    2. publicvirtualvoid MethodA() 
    3.      //do something  
    4. public abstract void run(); 
    5.      publicclass B:A 
    6. public override void MethodA() 
    7.     //do somthing  
    8. publicvirtualvoid run() 
    9.     //do something  
    10.     
    new
        c#中,new的关键字主要有三个功能:
    1. 作为运算符用来创建类的一个对象。 Class obj = new Class();
    2. 作为修饰符。
    3. 用于在泛型声明中约束可能用作类型参数的参数类型。(这个不太清楚)
          在这里主要介绍第2个功能,作为修饰符的作用。
          new声明的方法,当使用子类的类型来调用的时候,它会运行子类的函数,而如果类型是基类的话,被隐藏的基类函数会被调用。
           而子类中函数使用override的时候,则当使用子类的类型来调用的是,它会运行子类的函数,类型是基类的时候,仍会调用子类函数。
     
     
           如下例:
           
    1. // Define the base class  
    2.   class Car 
    3.   { 
    4.       publicvirtualvoid DescribeCar() 
    5.       { 
    6.           System.Console.WriteLine("Four wheels and an engine."); 
    7.       } 
    8.   } 
    9.   // Define the derived classes  
    10.   class ConvertibleCar : Car 
    11.   { 
    12.       publicnewvoid DescribeCar() 
    13.       { 
    14.           System.Console.WriteLine("A roof that opens up."); 
    15.       } 
    16.   } 
    17.  
    18.  
    19.   class Minivan : Car 
    20.   { 
    21.       public override void DescribeCar() 
    22.       { 
    23.           System.Console.WriteLine("Carries seven people."); 
    24.       } 
    25.   } 
    26.   publicclass Program 
    27.   { 
    28.       publicstaticvoid Main() 
    29.       { 
    30.           Car car1 = new Car(); 
    31.           car1.DescribeCar(); 
    32.           System.Console.WriteLine("----------"); 
    33.  
    34.  
    35.           Car car2 = new ConvertibleCar(); 
    36.           car2.DescribeCar(); 
    37.           System.Console.WriteLine("----------"); 
    38.  
    39.  
    40.           Car car3 = new Minivan(); 
    41.           car3.DescribeCar(); 
    42.           System.Console.WriteLine("----------"); 
    43.           System.Console.ReadKey(); 
    44.       } 
    45.   }      
    virtual
         virtual 关键字允许在派生类中重写这些对象。默认情况下,方法是非虚拟的,不可以重写非虚方法,virtual关键字不可以与static、abstract、private、override一起使用。virtual关键字又是和override紧密不可分的,如果要实现virtual方法就必须要使用override或new关键字(上文已经指出new和override产生的机理不同)。
        
     
    sealed
        
            当对一个类应用sealed修饰符时,此修饰符会阻止其他类从该类继承。
        sealed 方法必须与override连用,也就是说实现sealed方法的类的父类必须实现了此方法。
        sealed关键字有两个作用:
        1 密封类不能被继承。
        2 密封方法重写基类中的方法,但其本身不能在任何派生类中进一步重写
     
       sealed实例:
    1. class
    2.  
    3.     { 
    4.         protectedvirtualvoid F() { Console.WriteLine("X.F"); } 
    5.         protectedvirtualvoid F2() { Console.WriteLine("X.F2"); } 
    6.     } 
    7.     class Y : X 
    8.     { 
    9.         sealed protected override void F() { Console.WriteLine("Y.F"); } 
    10.         protected override void F2() { Console.WriteLine("X.F3"); } 
    11.     } 
    12.     class Z : Y 
    13.     { 
    14.         // Attempting to override F causes compiler error CS0239.  
    15.         // protected override void F() { Console.WriteLine("C.F"); }//sealed修饰的方法是不允许继承的  
    16.  
    17.         // Overriding F2 is allowed.  
    18.         protected override void F2() { Console.WriteLine("Z.F2"); } 
    19.     }
          
    整体的一个简单实例如下:
    1. namespace testVirtualF 
    2.     interface BaseInterface 
    3.     { 
    4.         void doWork(); 
    5.     } 
    6.     public abstract class Base:BaseInterface 
    7.     { 
    8.         publicvirtualvoid work() 
    9.         { 
    10.             Console.WriteLine("基类---现在是上班时间"); 
    11.         } 
    12.         publicvirtualvoid outWork() 
    13.         { 
    14.             Console.WriteLine("基类---现在是下班时间"); 
    15.         } 
    16.          
    17.         public abstract void play();//声明抽象方法,只能在抽象方法中  
    18.         public abstract void doWork();//实现接口的抽象类,可以将接口方法映射到抽象方法中  
    19.     } 
    20.  
    21.     publicclass Employer:Base 
    22.     { 
    23.         public  newvoid work() 
    24.         { 
    25.             Console.WriteLine("子类(new)---现在是上班时间"); 
    26.         } 
    27.         public override void outWork() 
    28.         { 
    29.             Console.WriteLine("子类(override)---现在是下班时间"); 
    30.         } 
    31.         public override void play() 
    32.         { 
    33.             Console.WriteLine("子类(override)---父类抽象方法"); 
    34.         } 
    35.         public override void doWork() 
    36.         { 
    37.             Console.WriteLine("父类抽象方法--doWork"); 
    38.         } 
    39.     } 
    40.     class Program 
    41.     { 
    42.         staticvoid Main(string[] args) 
    43.         { 
    44.             /*Employer emp = new Employer();
    45.             emp.work();
    46.             emp.outWork();
    47.             emp.play();*/ 
    48.             /*输出结果
    49.              * 子类(new)---现在是上班时间
    50.              * 子类(override)---现在是下班时间
    51.              */ 
    52.  
    53.             /*Employer emp = new Employer();
    54.             Base b = (Base)emp;
    55.             //b.ID = "123";
    56.             b.work();
    57.             b.outWork();
    58.             b.play();*/ 
    59.             /*执行结果
    60.              * 基类---现在是上班时间
    61.              * 子类(new)---现在是上班时间
    62.              * 子类(override)---现在是下班时间
    63.              */ 
    64.  
    65.             Base b = new Employer(); 
    66.             b.work(); 
    67.             b.outWork(); 
    68.             b.play(); 
    69.             /*执行结果
    70.              * 基类---现在是上班时间
    71.              * 子类(new)---现在是上班时间
    72.              * 子类(override)---现在是下班时间
    73.              */ 
    74.         } 
    75.     } 
  • 相关阅读:
    Angular 11 中 Schematics 的代码优化
    GoEasy使用阿里云OSS出现的问题
    易班模拟登录-Day1笔记
    类型别名与接口
    TypeScript中的数据类型
    Javascript类型系统
    手写Promise3
    手写Promise2
    手写Promise1
    Promise基础用法2
  • 原文地址:https://www.cnblogs.com/binyao/p/3152762.html
Copyright © 2011-2022 走看看