继承与虚方法重写的区别
继承允许子类获取父类的成员(字段、属性、方法等),而虚方法重写(virtual和override)是继承中的一种多态机制,允许子类重新定义父类中标记为virtual的方法。
- 继承:子类自动拥有父类的非私有成员,无需重新实现。
- 虚方法重写 :父类用
virtual声明方法,子类用override重写逻辑,运行时根据对象实际类型调用对应方法。
示例代码
csharp
using System;
// 父类
public class Animal
{
// 虚方法
public virtual void MakeSound()
{
Console.WriteLine("Animal makes a sound");
}
}
// 子类重写虚方法
public class Dog : Animal
{
public override void MakeSound()
{
Console.WriteLine("Dog barks");
}
}
// 子类不重写虚方法
public class Cat : Animal
{
// 使用父类的默认实现
}
class Program
{
static void Main()
{
Animal animal = new Animal();
Animal dog = new Dog();
Animal cat = new Cat();
animal.MakeSound(); // 输出: Animal makes a sound
dog.MakeSound(); // 输出: Dog barks
cat.MakeSound(); // 输出: Animal makes a sound
}
}
常见问题与处理方法
问题1:忘记标记virtual或override
- 若父类方法未标记
virtual,子类无法重写。 - 若子类用
new代替override,会导致隐藏而非重写(编译警告)。
修正方法:
csharp
public class Bird : Animal
{
public override void MakeSound() // 正确使用override
{
Console.WriteLine("Bird chirps");
}
}
问题2:误用new关键字导致隐藏
new会隐藏父类方法,破坏多态性。
修正方法:
csharp
public class Fish : Animal
{
public new void MakeSound() // 不推荐,仅用于特殊场景
{
Console.WriteLine("Fish bubbles");
}
}
问题3:基类调用被重写方法
- 子类可通过
base调用父类实现。
示例:
csharp
public class Lion : Animal
{
public override void MakeSound()
{
base.MakeSound(); // 调用父类方法
Console.WriteLine("Lion roars");
}
}
关键总结
- 多态需通过
virtual和override配合实现。 - 避免滥用
new,优先使用重写。 - 使用
base可保留父类逻辑扩展功能。