当前位置:首页 > 技术 > 正文内容

C# 中的继承机制与虚方法实现

访客 技术 2026年9月2日 1

在 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");
}
标签: C#

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。