• c#重写与多态


    1.重写

    如下面的Run方法,在Car中被重写。

    namespace TestClass
    {
        class Program
        {
            static void Main(string[] args)
            { 
                Car car = new Car("初始车");  
                Console.ReadKey();
            }
        }
    
        /// <summary>
        /// 交通工具类
        /// </summary>
        class Vehicle
        {
            public string Owner { get; set; }
            /// <summary>
            /// 有参数的构造函数,注意,此时Vehicle这个类就不会再默认创建无参数的构造函数了。
            /// </summary>
            /// <param name="owner"></param>
            public Vehicle(string owner)
            {
                Owner = owner;
            }
            /// <summary>
            /// 这个方法被重写的前提是加vitrual关键字
            /// </summary>
            public  virtual void  Run()
            {
                Console.WriteLine("Vehicle is running");
    
            }
    
        }
    
        class Car : Vehicle
        { 
            /// <summary>
            /// 汽车类构造函数
            /// </summary>
            /// <param name="owner"></param>
            public Car(string owner):base(owner)
            {
               
            }
            public  override void Run()
            {
                Console.WriteLine("Vehicle is running");
    
            }
    
    
        }
         
    
    }

    2.多态

       同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,这就是多态性。换句话说,实际上就是同一个类型的实例调用“相同”的方法,产生的结果是不同的。这里的“相同”打上双引号是因为这里的相同的方法仅仅是看上去相同的方法,实际上它们调用的方法是不同的。

     也可以这样理解:多态是基于重写机制,函数成员的具体行为(版本)是由对象决定的。

    看下面的代码实现了多态: 

     class Program
        {
            static void Main(string[] args)
            {
                Vehicle raceCar = new RaceCar();
                Vehicle car = new Car();
                Vehicle vehicle = new Vehicle();
                RaceCar race  = new RaceCar();
                raceCar.Run();
                car.Run();
                vehicle.Run();
                race.Run();
                Console.ReadKey();
            }
        }
    
        /// <summary>
        /// 交通工具类
        /// </summary>
        class Vehicle
        { 
            /// <summary>
            /// 这个方法被重写的前提是加vitrual关键字
            /// </summary>
            public  virtual void  Run()
            {
                Console.WriteLine("Vehicle is running");
    
            } 
        }
    
        class Car : Vehicle
        {  
            public  override void Run()
            {
                Console.WriteLine("Car is running");
    
            } 
        }
        class RaceCar : Car
        { 
            /// <summary>
            ///  使用new关键字后,使得Run方法与父类中的Run方法成为毫不相关的两个方法,只是名字相同而已。
            /// </summary>
            public new void Run()
            {
                Console.WriteLine("RaceCar is running");
    
            }
    
    
        }

    结果:

    Car is running
    Car is running
    Vehicle is running
    RaceCar is running

    其中下面这2行代码输出结果是:Car is running。

    因为对象raceCar引用了RaceCar的实例,对象是Vehicle类的,是顺着继承链往下找Run方法,结果发现这个方法最新的重写是在Car类中,所以实际上输出的是Car中的数据。

      
    Vehicle raceCar = new RaceCar();
     
                raceCar.Run();
  • 相关阅读:
    OAuth认证介绍及腾讯微博OAuth认证示例
    Android PopupWindow介绍及实现菜单效果
    Android 输入法键盘和activity页面遮挡问题解决
    eclipse中android项目的编译过程分析
    Android Tween动画之RotateAnimation实现图片不停旋转
    eclipse 文件同步插件
    关于移动Web应用程序开发 HTML5、高性能JavaScript篇、Css的几篇较好博客
    Android 记录和恢复ListView滚动的位置的三种方法
    Apache的功能模块
    如何防止自己网站的图片被其他网站所盗用,从而导致自己网站流量的损失【apache篇】
  • 原文地址:https://www.cnblogs.com/anjingdian/p/13127649.html
Copyright © 2020-2023  润新知