zoukankan      html  css  js  c++  java
  • C#中的Virtual、Override和new关键词理解

    来源:http://blog.csdn.net/jackiezhw/article/details/2673992

    在 C# 中,派生类可以包含与基类方法同名的方法。

    • 基类方法必须定义为 virtual。
    • 如果派生类中的方法前面没有 new 或 override 关键字,则编译器将发出警告,该方法将有如存在 new 关键字一样执行操作。
    • 如果派生类中的方法前面带有 new 关键字,则该方法被定义为独立于基类中的方法。
    • 如果派生类中的方法前面带有 override 关键字,则派生类的对象将调用该方法,而不是调用基类方法。
    • 可以从派生类中使用 base 关键字调用基类方法。
    • override、virtual 和 new 关键字还可以用于属性、索引器和事件中。
     1 using System;  
     2 using System.Collections.Generic;  
     3   
     4   
     5 public class Car  
     6 {  
     7   
     8     public virtual void DescribeCar()  
     9     {  
    10         Console.WriteLine("Base Car!");  
    11     }  
    12   
    13 }  
    14   
    15   
    16 public class ConvertibleCar : Car  
    17 {  
    18     public new void DescribeCar()  
    19     {  
    20         base.DescribeCar();  
    21         Console.WriteLine("Convertible Car!");  
    22     }  
    23 }  
    24   
    25 public class DerivedConvertibleCar : ConvertibleCar  
    26 {  
    27     public new void DescribeCar()  
    28     {  
    29         base.DescribeCar();  
    30         Console.WriteLine("DerivedConvertibleCar Car!");  
    31     }  
    32 }  
    33   
    34   
    35 public class DerivedMinivan : Minivan  
    36 {  
    37     public override void DescribeCar()  
    38     {  
    39         base.DescribeCar();  
    40         Console.WriteLine("DerivedMinivan Car!");  
    41     }  
    42 }  
    43 public class Minivan : Car  
    44 {  
    45     public override void DescribeCar()  
    46     {  
    47         base.DescribeCar();  
    48         Console.WriteLine("Minivan Car!");  
    49     }  
    50 }  
    51   
    52   
    53 public class CarCollections  
    54 {  
    55     public static void Main()  
    56     {  
    57         List<CAR> cars = new List<CAR>();  
    58   
    59         cars.Add(new Car());  
    60         cars.Add(new ConvertibleCar());  
    61         cars.Add(new Minivan());  
    62         cars.Add(new DerivedConvertibleCar());  
    63         cars.Add(new DerivedMinivan());  
    64         foreach (Car car in cars)  
    65             car.DescribeCar();  
    66     }  
    67 }  


    输出结果:

    Base Car!【Car】
    Base Car!【ConvertibleCar】
    Base Car!【Minivan】
    Minivan Car!
    Base Car!【DerivedConvertibleCar】
    Base Car!【DerivedMinivan 】
    Minivan Car!
    DerivedMinivan Car!

    可以看到使用new和使用override的效果是不一样的。

  • 相关阅读:
    NC13950 Alliances(LCA)
    NC13884 Paint Box(容斥原理)
    Gym102174B 炼金术(AC自动机)
    CF301D Yaroslav and Divisors(树状数组)
    CF1443D Extreme Subtraction(思维)
    Gym102174L 旅行的意义(期望dp)
    Gym102220F Mini-game Before Contest(博弈论)
    Gym102220D Master of Data Structure (虚树)
    用random.simple来解决从0-99这100个数中随机取10个不重复的数
    一个栈的输入序列为1,2,3,4,5,则下列序列中不可能是栈的输出序列的是()
  • 原文地址:https://www.cnblogs.com/spriteflk/p/3816302.html
Copyright © 2011-2022 走看看