MST

星途 面试题库

面试题:C# 基础语法与数据类型之方法重载与重写

请阐述 C# 中方法重载(Overload)和重写(Override)的区别,并举例说明在什么场景下会分别使用到它们。
38.8万 热度难度
编程语言C#

知识考点

AI 面试

面试题答案

一键面试

区别

  1. 定义位置
    • 方法重载(Overload):发生在同一个类中,多个方法具有相同的方法名,但参数列表不同(参数个数、类型或顺序不同)。
    • 方法重写(Override):发生在继承关系中,子类重写父类中声明为 virtual 或 abstract 的方法。
  2. 修饰符
    • 方法重载:与修饰符无关,只要方法名相同且参数列表不同即可。
    • 方法重写:子类重写方法必须使用 override 关键字,父类被重写方法必须是 virtual 或 abstract 修饰。
  3. 返回类型
    • 方法重载:返回类型可以相同也可以不同,只要参数列表不同就行。
    • 方法重写:返回类型必须与父类被重写方法的返回类型相同(在 C# 4.0 及以上,子类重写方法的返回类型可以是父类被重写方法返回类型的派生类型,即协变返回类型)。

场景举例

  1. 方法重载场景
    • 例如在一个数学计算类中,可能需要对不同类型的数据进行加法操作。
public class MathOperations
{
    public int Add(int a, int b)
    {
        return a + b;
    }
    public double Add(double a, double b)
    {
        return a + b;
    }
}

这里在 MathOperations 类中定义了两个 Add 方法,一个用于整数加法,一个用于双精度浮点数加法,通过方法重载满足了对不同数据类型加法操作的需求。 2. 方法重写场景

  • 假设有一个图形基类 Shape,其中有一个计算面积的虚方法 CalculateArea。然后有子类 CircleRectangle 继承自 Shape,并分别重写 CalculateArea 方法来计算各自的面积。
public class Shape
{
    public virtual double CalculateArea()
    {
        return 0;
    }
}
public class Circle : Shape
{
    private double radius;
    public Circle(double r)
    {
        radius = r;
    }
    public override double CalculateArea()
    {
        return Math.PI * radius * radius;
    }
}
public class Rectangle : Shape
{
    private double width;
    private double height;
    public Rectangle(double w, double h)
    {
        width = w;
        height = h;
    }
    public override double CalculateArea()
    {
        return width * height;
    }
}

在这个例子中,子类 CircleRectangle 根据自身的特性重写了父类 ShapeCalculateArea 方法,以实现正确的面积计算。