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 的实现。
  • 相关阅读:
    使用 requests 维持会话
    使用 requests 发送 POST 请求
    使用 requests 发送 GET 请求
    requests 安装
    使用 urllib 分析 Robots 协议
    使用 urllib 解析 URL 链接
    使用 urllib 处理 HTTP 异常
    使用 urllib 处理 Cookies 信息
    使用 urllib 设置代理服务
    按单生产程序发布
  • 原文地址:https://www.cnblogs.com/qishichang/p/1228569.html
Copyright © 2011-2022 走看看