
AI
在C#中,遮蔽(shadowing)和覆盖(override)是两种不同的方法,用于在派生类中重新定义基类中的成员。尽管它们的目的相似,但在实际应用中有一些重要的区别。
遮蔽是指在派生类中重新定义与基类中同名的成员,但不改变其签名。这意味着派生类中的成员将隐藏基类中的成员,使其对派生类不可见。这种行为类似于隐藏在阴影中,因此被称为遮蔽。遮蔽可以应用于字段、方法、属性和事件。在下面的示例中,我们有一个基类Animal和一个派生类Dog。在派生类中,我们使用遮蔽来重新定义基类中的方法Speak。由于遮蔽的存在,派生类中的Speak方法将隐藏基类中的Speak方法。csharpclass Animal{ public void Speak() { Console.WriteLine("Animal speaks"); }}class Dog : Animal{ public new void Speak() { Console.WriteLine("Dog barks"); }}class Program{ static void MAIn(string[] args) { Animal animal = new Animal(); animal.Speak(); // 输出 "Animal speaks" Dog dog = new Dog(); dog.Speak(); // 输出 "Dog barks" Animal dogAsAnimal = new Dog(); dogAsAnimal.Speak(); // 输出 "Animal speaks" }}在上面的例子中,我们首先创建了一个Animal对象,并调用其Speak方法。由于没有派生类来遮蔽该方法,因此输出是"Animal speaks"。然后,我们创建了一个Dog对象,并调用其Speak方法。由于Dog类中重新定义了Speak方法并使用了遮蔽,输出是"Dog barks"。最后,我们创建了一个Animal类型的变量dogAsAnimal,并将其指向Dog对象。当我们调用dogAsAnimal的Speak方法时,由于变量类型是Animal,编译器将使用基类中的Speak方法,因此输出是"Animal speaks"。从上述例子中可以看出,遮蔽是静态绑定的,即在编译时确定调用的是哪个成员。这意味着无论我们将派生类对象赋值给基类变量还是直接使用派生类对象,都无法调用被遮蔽的成员。覆盖,顾名思义,是指在派生类中重新定义基类中的成员,并且改变其实现。这意味着派生类中的成员将覆盖基类中的成员,使其对派生类可见。覆盖只能应用于虚方法、属性和事件。以下是一个示例,演示了如何使用覆盖来重新定义基类中的虚方法:csharpclass Animal{ public virtual void Speak() { Console.WriteLine("Animal speaks"); }}class Dog : Animal{ public override void Speak() { Console.WriteLine("Dog barks"); }}class Program{ static void MAIn(string[] args) { Animal animal = new Animal(); animal.Speak(); // 输出 "Animal speaks" Dog dog = new Dog(); dog.Speak(); // 输出 "Dog barks" Animal dogAsAnimal = new Dog(); dogAsAnimal.Speak(); // 输出 "Dog barks" }}在上面的例子中,我们将Animal类中的Speak方法定义为虚方法,并在派生类Dog中使用override关键字来覆盖该方法。当我们创建一个Animal对象并调用Speak方法时,输出是"Animal speaks"。当我们创建一个Dog对象并调用Speak方法时,由于Dog类中覆盖了基类的Speak方法,输出是"Dog barks"。最后,我们创建了一个Animal类型的变量dogAsAnimal,并将其指向Dog对象。当我们调用dogAsAnimal的Speak方法时,由于变量类型是Animal,但实际上指向的是Dog对象,所以输出也是"Dog barks"。在C#中,覆盖是动态绑定的,即在运行时确定调用的是哪个成员。这意味着当我们使用基类变量引用派生类对象时,实际上调用的是派生类中覆盖的成员。这使得覆盖具有多态性的特点,可以根据实际对象的类型来确定调用的方法。遮蔽和覆盖都是在派生类中重新定义基类成员的方法,但它们在实现和调用方式上有所不同。遮蔽是静态绑定的,只能隐藏基类成员,而覆盖是动态绑定的,可以改变基类成员的实现并具有多态性。在实际开发中,我们需要根据具体需求来选择使用遮蔽还是覆盖。Copyright © 2025 IZhiDa.com All Rights Reserved.
知答 版权所有 粤ICP备2023042255号