一文详解C#中重写(override)及覆盖(new)的区别
背景
在C#中,类成员的重写和覆盖是比较常见的概念,但很多人容易混淆二者的区别。本文将详细解释重写和覆盖的概念,并提供示例代码进行解释。
重写(override)
重写表明一个子类的方法将重写基类的方法。必须在子类中使用与父类相同的方法名称、返回类型和参数列表,才能重写基类的方法。子类的方法的访问修饰符必须比基类的方法访问修饰符更为限制。例如,如果基类的方法为public,则子类重写此方法时只能使用public或protected修饰符。
示例
假设我们有一个基类Animal
和一个子类Cat
,如下所示:
class Animal {
public virtual void Speak() {
Console.WriteLine("I'm an animal.");
}
}
class Cat : Animal {
public override void Speak() {
Console.WriteLine("Meow!");
}
}
var cat = new Cat();
cat.Speak(); // 输出:Meow!
在例子中,Cat
类重写了Animal
类的Speak
方法。在子类中使用override
关键字,代表覆盖父类的该方法的实现。
覆盖(new)
覆盖表明在子类中定义一个新的方法,与继承的基类的方法名称、返回类型和参数列表相同。不同于重写,覆盖的方法与基类的方法没有关系,基类的方法在子类中不可见。当使用基类的实例访问这个方法时,只有基类的方法会被调用,不会执行子类中的方法。
示例
继续以Animal
和Cat
类为例:
class Animal {
public void Speak() {
Console.WriteLine("I'm an animal.");
}
}
class Cat : Animal {
public new void Speak() {
Console.WriteLine("Meow!");
}
}
Animal animal1 = new Cat();
animal1.Speak(); // 输出:I'm an animal.
Cat cat1 = new Cat();
cat1.Speak(); // 输出:Meow!
在例子中,Cat
类覆盖了Animal
类的Speak
方法,使用new
关键字指示这个方法是一个新的方法,与基类的方法无关。当使用基类的实例访问这个方法时,只有基类的方法会被调用,不会执行子类中的方法。
总结
重写和覆盖在C#语言中属于面向对象编程里的重要概念,它们定义了子类与基类之间的关系,帮助程序员构建正确、有效和易于维护的代码。同时要注意,重写只能用于方法、属性、索引器和事件的重写;而覆盖只能用于方法。
通过以上两条示例,相信大家已经理解了重写和覆盖的区别。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:一文详解C#中重写(override)及覆盖(new)的区别 - Python技术站