zoukankan      html  css  js  c++  java
  • C#之virtual override new解析

    温故而知新,是智也。

    virtual允许派生类重写该方法。默认情况下方法是非虚的,不允许重写。

    override重写基类具有相同签名的方法,不可重写非虚方法和静态方法,对应基类同名方法的关键字是virtualabstract

    new常用于:作为运算符,创建对象及调用构造函数;作为修饰符,隐藏基类具有相同签名的方法;用于泛型约束,约束参数类型。

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 using System.Threading.Tasks;
     6 
     7 namespace ConsoleApplication
     8 {
     9     class Program
    10     {
    11         static void Main(string[] args)
    12         {
    13             MyChild mychild = new MyChild();
    14             MyBase mybase1 = new MyBase();
    15             MyBase mybase2 = mychild;
    16 
    17             mybase1.Say();  //MyBase.Say
    18             mybase2.Say();  //MyBase.Say
    19             mychild.Say();  //MyChild.Say
    20 
    21             mybase1.Speak();    //MyBase.Speak
    22             mybase2.Speak();    //MyChild.Speak,注意这里不是MyBase.Speak
    23             mychild.Speak();    //MyChild.Speak
    24 
    25             mybase1.Talk(); //MyBase.Talk
    26             mybase2.Talk(); //MyBase.Talk
    27             mychild.Talk(); //MyChild.Talk
    28 
    29             mybase1.Tell(); //MyBase.Tell
    30             mybase2.Tell(); //MyBase.Tell
    31             mychild.Tell(); //MyChild.Tell
    32 
    33             Console.ReadKey();
    34         }
    35     }
    36 
    37     class MyBase
    38     {
    39         public virtual void Say() { Console.WriteLine("MyBase.Say"); }
    40         public virtual void Speak() { Console.WriteLine("MyBase.Speak"); }
    41         public virtual void Talk() { Console.WriteLine("MyBase.Talk"); }
    42         public void Tell() { Console.WriteLine("MyBase.Tell"); }
    43     }
    44     class MyChild : MyBase
    45     {
    46         public new void Say() { Console.WriteLine("MyChild.Say"); }    //new修饰符显式隐藏基类方法
    47         public override void Speak() { Console.WriteLine("MyChild.Speak"); }   //override修饰符重写基类方法
    48         public void Talk() { Console.WriteLine("MyChild.Talk"); }   //隐式隐藏基类方法
    49         public void Tell() { Console.WriteLine("MyChild.Tell"); }   //隐式隐藏基类方法
    50     }
    51 }
  • 相关阅读:
    08 正则表达式
    07 函数&对象
    06 Math&Date&Json
    05 数组&字符串
    04 循环控制
    03 流程控制
    02 数据类型&运算符
    大道至简
    Avg_row_length是怎么计算的?
    理解innodb buffer pool
  • 原文地址:https://www.cnblogs.com/maiaimei/p/7405472.html
Copyright © 2011-2022 走看看