C# 中的继承机制与虚方法实现
在 C# 中,继承是面向对象编程的核心特性之一,它允许一个类(派生类)基于另一个类(基类)进行扩展,从而复用已有代码并建立类型之间的层次关系。
继承的基本结构
基类定义通用行为,派生类在此基础上添加或修改功能。C# 使用 : 语法指定继承关系:
class Vehicle
{
public virtual void Start()
{
Console.WriteLine("Vehicle started.");
}
}
class Car : Vehicle
{
public override void Start()
{
Console.WriteLine("Car engine ignited.");
}
}
访问控制与成员可见性
派生类能否访问基类成员取决于访问修饰符:
public:完全公开protected:仅限自身及派生类private:仅限定义类内部internal:同一程序集内可见
注意:private 成员对派生类不可见。
虚方法与多态
使用 virtual 关键字声明的方法可在派生类中被重写,这是实现运行时多态的关键机制。
abstract class Shape
{
public virtual double CalculateArea()
{
return 0;
}
}
class Circle : Shape
{
private double radius;
public Circle(double r) => radius = r;
public override double CalculateArea()
{
return Math.PI * radius * radius;
}
}
方法重写的规则
重写方法必须满足:
- 使用
override修饰符 - 签名(名称、参数列表、返回类型)与基类虚方法一致
- 访问级别不能比基类方法更严格
运行时绑定示例
即使通过基类引用调用方法,实际执行的是对象真实类型的实现:
Shape figure = new Circle(5.0);
Console.WriteLine(figure.CalculateArea()); // 输出圆的面积
密封机制
为防止进一步继承或重写,可使用 sealed:
class Base
{
public virtual void Method() { }
}
class Derived : Base
{
public sealed override void Method() { }
}
// class Further : Derived
// {
// // 编译错误:无法重写已密封的方法
// }
同样,sealed class 无法被继承。
构造函数调用链
派生类构造函数默认调用基类无参构造函数。若需显式调用特定基类构造函数,使用 base:
class Person
{
protected string name;
public Person(string name) => this.name = name;
}
class Student : Person
{
public Student(string name) : base(name)
{
Console.WriteLine($"{name} is now a student.");
}
}
继承限制与替代方案
C# 仅支持单继承,但可通过接口实现多重契约继承。例如:
interface IFlyable { void Fly(); }
interface ISwimmable { void Swim(); }
class Duck : Animal, IFlyable, ISwimmable
{
public void Fly() => Console.WriteLine("Duck flying");
public void Swim() => Console.WriteLine("Duck swimming");
}