C# new 和override重写的区别

发布时间 2023-06-05 17:47:41作者: 挖穿地球?

在 C# 中,函数前面加 override 和 new 都可以实现函数的重写(Overriding)。不过它们实现的方式不同,因此会有一些区别。

1.Override

在 C# 中,override 关键字主要用于重写父类中虚方法(Virtual Method),它表示子类中的方法会覆盖父类中的同名方法。使用 override 关键字后,子类的方法必须与父类中被重写的方法具有完全相同的签名和返回类型,并且访问修饰符不能比父类中的方法更严格。

示例代码如下所示:

class Animal {
    public virtual void move() {
        Console.WriteLine("Animal is moving");
    }
}

class Bird : Animal {
    public override void move() {
        Console.WriteLine("Bird is flying");
    }
}

在上述代码中,Bird 类重写了 Animal 类中的 move() 方法。如果需要在子类中调用这个方法,可以直接使用子类的实例进行调用,例如:

Bird bird = new Bird();
bird.move(); // 输出 "Bird is flying"

2.New

new 关键字与 override 关键字也可以实现函数的重写,但是它们的实现方式不同。使用 new 关键字,定义的是一个新方法,它隐藏了从基类继承的同名方法。这就意味着,当基类中的同名方法被调用时,将调用基类中的方法,而不是子类中的方法。

示例代码如下所示:

class Animal {
    public virtual void move() {
        Console.WriteLine("Animal is moving");
    }
}

class Bird : Animal {
    public new void move() {
        Console.WriteLine("Bird is flying");
    }
}

在上述代码中,Bird 类使用 new 关键字定义了一个新方法 move(),它与 Animal 类中的 move() 方法具有相同的签名和返回类型。如果需要在子类中调用这个方法,需要使用子类的实例,并显式地调用子类中的方法,例如:

Bird bird = new Bird();
bird.move(); // 输出 "Bird is flying"

Animal animal = new Bird();
animal.move(); // 输出 "Animal is moving"

3.总结

可以看到,在使用子类实例调用 move() 方法时,使用的是子类中被隐藏的新方法,输出 "Bird is flying";而在使用父类实例调用 move() 方法时,会使用基类中的方法,输出 "Animal is moving"。