为什么在C#中开发方法隐藏和方法重写?我不是在询问他们的实施情况。我特别询问发明者用语言创建这两件事的场景。为什么方法隐藏在不同场景(代码示例)中有用,为什么不在。为什么方法覆盖在某些情况下运行良好以及为什么它不在其他情况下。实际例子将不胜感激。请注意,我不是要求实施。
答案 0 :(得分:1)
假设您要创建一个代表汽车的类,另一个代表卡车。你可能会注意到它们都有很多常见的属性(比如它们有weels,引擎,重量,长度等等)和方法(让我们说“turnON”和“turnOFF”引擎,增加/减少加速等)。
你做什么的?你会用完全相同的代码编写2个类,并且只为卡车添加weagon吗?
不,你写了一个“Car”类,包含汽车的所有方法和属性,以及你制作的一些属性然后“覆盖”(取决于如何做的语言 - 我是C# programer所以将“抽象”ou“虚拟”,视情况而定。)
然后,“卡车”将覆盖最大速度或站点,或者说它在前部和纬纱上有多少个纬纱,如果它有一个轴与之间等等。
另一方面,隐藏方法是当基本方法不能被重写时(因为,取决于语言,如果不是“制作”可覆盖,它不能被重写)因此,在声明方法时在儿童班上,它“隐藏”了原来的那个。怎么回事?让我们说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; } } }
}
通过这样做,Truck类会覆盖“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)会有问题,但对于overriten方法(长度)则不然。由于长度将被用于它的最高实现(它是卡车上的虚拟方法),它将始终按照实际类的方式工作,但MaxSpeed将使用Car类中的方法写入,即使它是卡车。如果函数/方法使用Truck作为参数,它将仅按照Truck类的预期进行。