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();

 

posted @   安静点--  阅读(231)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术
点击右上角即可分享
微信分享提示