zoukankan      html  css  js  c++  java
  • C# virtual,override或者new

    在C#中,如果你在声明一个方法的时候用了virtual这个关键字,那么,在派生类中,你就可以使用override或者new关键字来弃用它或是忽略它.如果你在父类中用了virtual这个关键字,而在其派生类中又没有用override或new关键字,而直接引用一个同名方法的话,编译器将会报错,并将以new方式,即忽略派生类中的方法的方式来运行.下面的例子可以帮助你来理解:
     public class MyBase
     {
     public virtual string Meth1()
    {
     return "MyBase-Meth1";
     }
     public virtual string Meth2()
    {
     return "MyBase-Meth2";
     }
     public virtual string Meth3()
     {
     return "MyBase-Meth3";
     }
     }
     
     class MyDerived : MyBase
     {
     public override string Meth1()
     {
     return "MyDerived-Meth1";
     }
     public new string Meth2()
     {
     return "MyDerived-Meth2";
     }
     public string Meth3() // 系统在这里将会有一个警告,并且将会隐藏方法Meth3()
     {
     return "MyDerived-Meth3";
     }
     
     public static void Main()
     {
     MyDerived mD = new MyDerived();
     MyBase mB = (MyBase) mD;
     
     System.Console.WriteLine(mB.Meth1());
     System.Console.WriteLine(mB.Meth2());
     System.Console.WriteLine(mB.Meth3());
     }
     }
    输出:

    MyDerived-Meth1
    MyBase-Meth2
    MyBase-Meth3

      可以很明显地看出来,后两个new关键字的输出是父类中的方法的输出,所以可以看出,new这个关键字的作用是如果在以前的版本中有这个方法,就沿用以前的方法,而不用我现在方法内容.而virtual的方法的作用正好相反,它的作用是如果在父类中有这样一个方法,则用我现在写的方法内容,让以前的滚蛋!不过,这里用new好象不太好,让人误解

    如果你把第037行去掉,把039-041中的mB全部改为mD,输出又变为:

    (把Main()改成:

    public static void Main()
     {
     MyDerived mD = new MyDerived();
     
     System.Console.WriteLine(mD.Meth1());
     System.Console.WriteLine(mD.Meth2());
     System.Console.WriteLine(mD.Meth3());
     }
     }


    MyDerived-Meth1
    MyDerived-Meth2
    MyDerived-Meth3

      这又说明了什么呢,说明了派生类的对象只有在被父类重塑的时候,override和new关键字才会生效

  • 相关阅读:
    线性回归——梯度下降法
    线性回归——最小二乘法_实例(二)
    线性回归——最小二乘法(二)
    线性回归——最小二乘法_实例(一)
    线性回归——最小二乘法(一)
    Spark——SparkContext简单分析
    Kubernets搭建Kubernetes-dashboard
    Docker中部署Kubernetes
    Akka初步介绍
    laravel The Process class relies on proc_open, which is not available on your PHP installation.
  • 原文地址:https://www.cnblogs.com/lordrobert/p/1422732.html
Copyright © 2011-2022 走看看