C# 中的 override 和 new 关键字有什么区别

c++

1个回答

写回答

meg.curry

2025-06-23 18:20

+ 关注

AI
AI

在C#中,override和new是两个关键字,用于处理派生类中的成员重写问题。虽然它们都可以用于实现成员的覆盖,但它们之间有一些关键的区别。

首先,override关键字用于在派生类中重写基类中的虚方法、抽象方法或接口方法。通过使用override关键字,派生类可以重新实现基类中的方法,并提供自己的实现逻辑。当调用重写的方法时,编译器会动态地确定调用基类还是派生类的实现。

以下是一个使用override关键字的示例:

csharp

class Animal

{

public virtual void MakeSound()

{

Console.WriteLine("Animal makes a sound");

}

}

class Cat : Animal

{

public override void MakeSound()

{

Console.WriteLine("Cat meows");

}

}

class Dog : Animal

{

public override void MakeSound()

{

Console.WriteLine("Dog barks");

}

}

class Program

{

static void MAIn(string[] args)

{

Animal animal1 = new Animal();

Animal animal2 = new Cat();

Animal animal3 = new Dog();

animal1.MakeSound(); // Output: Animal makes a sound

animal2.MakeSound(); // Output: Cat meows

animal3.MakeSound(); // Output: Dog barks

}

}

在上面的例子中,Animal类定义了一个虚方法MakeSound,而Cat类和Dog类分别重写了该方法。当调用MakeSound方法时,根据实际的对象类型,会分别调用Cat类和Dog类中的实现。

然而,new关键字与override关键字有着明显的区别。new关键字用于在派生类中隐藏基类中的成员,而不是重写它。使用new关键字隐藏基类成员后,调用该成员时将只能访问派生类中的隐藏版本,而无法访问基类中的版本。

以下是一个使用new关键字的示例:

csharp

class Animal

{

public void MakeSound()

{

Console.WriteLine("Animal makes a sound");

}

}

class Cat : Animal

{

public new void MakeSound()

{

Console.WriteLine("Cat meows");

}

}

class Dog : Animal

{

public new void MakeSound()

{

Console.WriteLine("Dog barks");

}

}

class Program

{

static void MAIn(string[] args)

{

Animal animal1 = new Animal();

Animal animal2 = new Cat();

Animal animal3 = new Dog();

animal1.MakeSound(); // Output: Animal makes a sound

animal2.MakeSound(); // Output: Cat meows

animal3.MakeSound(); // Output: Dog barks

}

}

在上面的例子中,Animal类的MakeSound方法被Cat类和Dog类隐藏了。当使用Animal类型的变量引用Cat类或Dog类的实例时,调用MakeSound方法将调用派生类中的隐藏版本。

使用override还是new?

在选择使用override还是new关键字时,需要根据实际的需求和设计目标来决定。通常情况下,应该优先使用override关键字来实现方法的重写,以便利用多态性和基类引用的优势。而使用new关键字则更适合于隐藏基类中的成员,以实现特定的行为。

使用override关键字时,还需要注意以下几点:

1. 基类中的方法必须使用virtual、ABStract或override关键字进行标记。

2. 派生类中的方法必须使用override关键字进行标记。

3. 方法签名(包括返回类型、方法名和参数列表)必须与基类中的方法一致。

对于new关键字,需要注意以下几点:

1. 隐藏基类成员后,将无法通过基类引用访问到该成员。

2. 使用new关键字时,建议在方法前添加关键字public new来明确隐藏基类成员的意图。

在C#中,override关键字用于在派生类中重写基类中的虚方法、抽象方法或接口方法,而new关键字用于隐藏基类中的成员。通过使用override关键字,派生类可以提供自己的实现逻辑,并利用多态性的优势。而使用new关键字则更适合于实现特定的行为,并隐藏基类中的成员。在选择使用override还是new关键字时,需要根据实际的需求和设计目标来决定。

举报有用(4)分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号