zoukankan      html  css  js  c++  java
  • 了解何时使用 Override 和 New 关键字(C# 编程指南)


    C# 允许派生类中的方法与基类中的方法具有相同的名称,只要您非常明确应如何处理新方法。下面的示例演示 newoverride 关键字的使用。

    首先声明三个类:一个名为 Car 的类以及从该基类派生的两个类 ConvertibleCar 和 Minivan。基类包含一个可将有关汽车的描述发送到控制台的方法 (DescribeCar)。派生类方法也包含一个名为 DescribeCar 的方法,该方法显示派生类的独特属性。这些方法还调用基类的 DescribeCar 方法来演示从 Car 类继承属性的方式。

    为了强调区别,ConvertibleCar 类使用 new 关键字来定义,而 Minivan 类使用 override 来定义。

    // Define the base class
    class Car
    {
    public virtual void DescribeCar()
    {
    System.Console.WriteLine("Four wheels and an engine.");
    }
    }

    // Define the derived classes
    class ConvertibleCar : Car
    {
    public new virtual void DescribeCar()
    {
    base.DescribeCar();
    System.Console.WriteLine("A roof that opens up.");
    }
    }

    class Minivan : Car
    {
    public override void DescribeCar()
    {
    base.DescribeCar();
    System.Console.WriteLine("Carries seven people.");
    }
    }

    现在可以编写一些代码来声明这些类的实例,并调用它们的方法以便对象能够描述其自身:


    public static void TestCars1()
    {
    Car car1 = new Car();
    car1.DescribeCar();
    System.Console.WriteLine("----------");

    ConvertibleCar car2 = new ConvertibleCar();
    car2.DescribeCar();
    System.Console.WriteLine("----------");

    Minivan car3 = new Minivan();
    car3.DescribeCar();
    System.Console.WriteLine("----------");
    }

    正如预期的那样,输出类似如下所示:

    Four wheels and an engine.

    ----------

    Four wheels and an engine.

    A roof that opens up.

    ----------

    Four wheels and an engine.

    Carries seven people.

    ----------

    但是,在该代码接下来的一节中,我们声明了一个从 Car 基类派生的对象的数组。此数组能够存储 Car、ConvertibleCar 和 Minivan 对象。该数组的声明类似如下所示:


    public static void TestCars2()
    {
    Car[] cars = new Car[3];
    cars[0] = new Car();
    cars[1] = new ConvertibleCar();
    cars[2] = new Minivan();
    }

    然后可以使用一个 foreach 循环来访问该数组中包含的每个 Car 对象,并调用 DescribeCar 方法,如下所示:


    foreach (Car vehicle in cars)
    {
    System.Console.WriteLine("Car object: " + vehicle.GetType());
    vehicle.DescribeCar();
    System.Console.WriteLine("----------");
    }

    此循环的输出如下所示:

    Car object: YourApplication.Car

    Four wheels and an engine.

    ----------

    Car object: YourApplication.ConvertibleCar

    Four wheels and an engine.

    ----------

    Car object: YourApplication.Minivan

    Four wheels and an engine.

    Carries seven people.

    ----------

    注意,ConvertibleCar 说明与您的预期不同。由于使用了 new 关键字来定义此方法,所调用的不是派生类方法,而是基类方法。Minivan 对象正确地调用重写方法,并产生预期的结果。

    若要强制一个规则,要求从 Car 派生的所有类都必须实现 DescribeCar 方法,则应创建一个新的基类,将方法 DescribeCar 定义为 abstract。抽象方法不包含任何代码,仅包含方法签名。从此基类派生的任何类都必须提供 DescribeCar 的实现。
  • 相关阅读:
    <亲测>CentOS7yum安装PHP7.2
    linux开机出现一下错误Give root password for maintenance (or type Control-D to continue):
    解决js输出汉字乱码问题
    <亲测>.NET Core项目在Linux上使用QRCoder时出错"Unable to load DLL 'gdiplus'"
    <亲测>阿里云centos7 挂载数据盘配置
    centos 磁盘清理 /dev/vda1系统盘满了
    两种方式:mysql查看正在执行的sql语句
    adb调试android设备 说的比较清楚的一篇文章
    <亲测>window+iis+letsencrypt+ssl 手动续期(通配符域名)
    申请免费通配符证书(Let's Encrypt)并绑定IIS
  • 原文地址:https://www.cnblogs.com/qishichang/p/1228569.html
Copyright © 2011-2022 走看看