需要方法隐藏和方法覆盖

Need for method hiding and method overriding

为什么要在C#中开发方法隐藏和方法覆盖?我不是在问他们的实施情况。我特别询问发明家希望用语言创造这两个东西的场景。为什么方法隐藏在不同的场景(代码示例)中有用,为什么不是。为什么方法覆盖在某些情况下效果很好,而在其他情况下却不行。实际示例将不胜感激。请注意,我不是要求实施。

你问为什么? "why" 很简单:允许 classes/objects.

的多态性

假设您要创建一个 class 代表汽车,另一个代表卡车。你可能会注意到两者都有很多共同的属性(比如它们有轮子、引擎、重量、长度等等)和方法(比如 "turnON" 和 "turnOFF" 引擎, increase/decrase 加速度等).

你是做什么的?你会用完全相同的代码编写 2 classes,然后只添加卡车的 weagon 吗?

不,你写了一个 "Car" class,其中包含汽车的所有方法和属性,以及你随后创建的一些属性 "overridable"(取决于语言怎么做 - 我是一名 C# 程序员,所以会 "abstract" 或 "virtual",视情况而定)。

然后 "Truck" 将覆盖最大速度,或站点,或者说它在前部和 weagon 上有多少个轮子,如果它之间有一个轴等等

另一方面,隐藏方法是当基方法不能被覆盖时(因为,根据语言,如果不是 "made" 可覆盖,它不能被覆盖)等等,在子 class 上声明一个方法时,它 "hides" 原来的方法。

这是怎么发生的?假设汽车 class 是这样的:

public class Car
{
    private double mLength;
    private int mMaxSpeed;
    public virtual double Length { get { return this.mLength; } set { if (value > 0) { this.mLength = value; } } }
    public int MaxSpeed { get { return this.mMaxSpeed; } set { if (value > 0 && value < 350) { this.mMaxSpeed = value; } } }
}

现在,在 C# 上,"virtual" 关键字指示方法(或本例中的 属性)可以被覆盖,因此缺少它意味着它不能。 class 允许覆盖 "Length" 属性,但不能覆盖 "MaxSpeed".

所以,当我写 Truck class 时,会像这样:

public class Truck : Car
{
    public override double Length { get { return base.Length; } set { if (value > 20.00) { base.Length = value; } } }
    public new int MaxSpeed { get { return base.MaxSpeed; } set { if (value < 100 && value > 0) { base.MaxSpeed = value; } } }
}

通过这样做,卡车 class 覆盖了 "Length",但隐藏了 "MaxSpeed"。 由于Truck继承(多态)Car,可以作为值传递给Car的任意变量,所以:

Car m1 = new Car();
Car m2 = new Truck();

这行得通,因为卡车(在我们的定义中)是一辆汽车。 那么,后果是什么?如果我创建一个方法,它有一个 Car 类型的参数,并且我传递了一个 Truck 实例,被覆盖的方法将调用(总是)它的最高实现,但隐藏的方法将调用特定类型的方法.

所以这个:

public static void Initialize(Car vehicle)
{
    vehicle.Length = 5.00; //if vehicle is a Car (not derivated) will be 5 if it's a truck will not set
    vehicle.MaxSpeed = 350; //will set to 350 for both, even if Truck does not allow over 100, the method called is on the car Class, not Truck
}

Initialize(new Car());
Initialize(new Truck()); //Length won't pass (as intended on Truck class to only allow higher than 20) but MaxSpeed will pass as 350, even if Truck does not allow it

隐藏方法 (MaxSpeed) 会有问题,但覆盖方法 (Length) 不会。由于 Length 将因其最高实现而被取消(它是卡车上覆盖的虚拟方法)它将始终按照实际 class 的意图工作,但 MaxSpeed 将使用写入 Car class 的方法被取消,即使它是一辆卡车。如果 function/method 使用 Truck 作为参数,它只会按预期在 Truck class 上被取消。