需要方法隐藏和方法重写



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

你问为什么?"为什么"很简单:允许类/对象的多态性。

假设您要创建一个类,该类将表示一辆汽车,另一个类表示一辆卡车。您可能会注意到,两者都有很多常见的属性(例如它们具有weels,发动机,重量,长度等)和方法(例如"打开"和"关闭"发动机,增加/减少加速度等)。

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

不,你写了一个"Car"类,其中包含汽车的所有方法和属性,以及你所做的一些属性然后"可覆盖"(取决于如何做到这一点的语言 - 我是一名 C# 程序员,所以会是"抽象的"ou"虚拟的",取决于情况)。

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

另一方面,隐藏方法是当基方法不能被覆盖时(因为,根据语言,如果不是"使"可重写,它不能被覆盖),因此,在子类上声明方法时,它会"隐藏"原始方法。

它是如何发生的?假设 Car 类是这样的:

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" 关键字指示方法(或在本例中为属性)可以被覆盖,因此缺少它意味着它不能。该类允许覆盖"长度"属性,但不允许覆盖"MaxSpeed"。

所以,当我编写卡车类时,会是这样的:

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; } } }
}

通过这样做,卡车类覆盖了"长度",但隐藏了"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 将用于其最高实现(它是卡车上覆盖的虚拟方法),因此它将始终按照实际类的意图工作,但 MaxSpeed 将使用 Car 类中的方法写入,即使它是卡车。仅当函数/方法使用 Truck 作为参数时,它才会按预期在 Truck 类上可用。

最新更新