zoukankan      html  css  js  c++  java
  • C#有关虚方法要知道的知识点:

    虚方法:这个方法其实就是为了重写方法而存在的(在声明中包含virtual关键字),否则没感觉到它存在的意义。

    其一:因为要重写所以它的访问类型如果为private则毫无意义阻碍了重写动作的进行也就是它不能私有化,所以C#中virtual关键字和private关键字不能同时使用。

    其二:因为静态的方法和抽象方法不能重写,同理C#中static,abstract关键字和virtual关键字不能同时使用。

    其三:不能在声明虚方法的同时指定重写虚方法,因为重写方法只能重写基类的虚方法,也就是要提前在基类中声明虚方法,所以virtual关键字和override关键字不能同时使用。

    重写方法:就是使从基类继承的虚方法提供新的实现(使用关键字override声明),从而为其子类所专有化。

    同上面的思路一样:因为静态的方法和抽象方法不能重写,同理C#中static,abstract,new关键字和override关键字不能同时使用。

    总结用法如下:

    非虚方法的实现(全部隐藏的虚方法)最初声明的是什么类的方法就永远是什么类的方法。

    虚方法的实现:最终是什么类型的方法就调用该类型的方法。

    (含有隐藏的)虚方法的实现:最终是什么类型的方法就调用(最靠近)该类型的方法。

    注:在派生类中重写基类中的虚方法时,可以使用base关键字调用基类中的虚方法。

    相关理解程序如下:

     1 namespace ClassAB
     2 {
     3     /*
     4      
     5       public class A
     6     {
     7         public virtual void Fun1(int i)
     8         {
     9             Console.WriteLine(i);
    10         }
    11         public void Fun2(A a)
    12         {
    13             a.Fun1(1);
    14             Fun1(5);
    15         }
    16     }
    17     class Program:A
    18     {
    19         public override void Fun1(int i)
    20         {
    21             base.Fun1(i+1);
    22         }
    23         static void Main(string[] args)
    24         {
    25             Program b = new Program();
    26             A a = new A();
    27             a.Fun2(b);          //2   5
    28             b.Fun2(a);          //1   6
    29             Console.ReadLine();
    30         }
    31     }
    32      */
    33     /*
    34      public abstract class A
    35     {
    36         public A()
    37         {
    38             Console.WriteLine('A');
    39         }
    40         public virtual void Fun()
    41         {
    42             Console.WriteLine("A.Fun()");
    43         }
    44     }
    45 
    46     class Program :A
    47     {
    48         public Program()
    49         {
    50             Console.WriteLine('B');
    51         }
    52         public new void Fun()
    53         {
    54             Console.WriteLine("B.Fun()");
    55         }
    56         static void Main(string[] args)
    57         {
    58             A a = new Program();
    59             a.Fun();        // A  B  A.Fun()
    60             Console.ReadLine();
    61         }
    62     }
    63      */
    64 
    65     class BaseClass
    66     {
    67         public virtual int Add(int x,int y)
    68         {
    69             return x+y;
    70         }
    71     }
    72     class Program:BaseClass
    73     {
    74         static int z = 100;
    75         public override int Add(int x, int y)
    76         {
    77             return base.Add(x,y)+z; //300
    78             // return x * y; 50
    79         }
    80          static void Main(string[] args)
    81         {
    82             BaseClass baseclass = new Program();
    83             Console.WriteLine(baseclass.Add(10,5));
    84             Console.ReadLine();
    85         }      
    86     }
  • 相关阅读:
    bash的for循环从命令读取值
    BFS-hdu-1226-超级密码
    计算机改名导致数据库链接的诡异问题
    There is insufficient system memory to run this query 错误
    SQL Server 2008 R2的发布订阅配置实践
    MS SQL 日常维护管理常用脚本(二)
    TreeSize工具介绍
    迁移Reporting Services的方法与WMI错误
    spring-session-data-redis解决session共享的问题
    elasticSearch6源码分析(12)DiscoveryModule
  • 原文地址:https://www.cnblogs.com/IamJiangXiaoKun/p/5730536.html
Copyright © 2011-2022 走看看