C# 继承与多态详解


.NET学习资料

.NET学习资料

.NET学习资料


在 C# 面向对象编程中,继承与多态是两个极为关键的特性,它们赋予了程序强大的复用性和灵活性。理解并掌握这两个特性,是成为一名优秀 C# 开发者的必经之路。

一、C# 继承

1.1 继承的定义与概念

继承是指一个新类(子类或派生类)可以获取另一个已存在类(父类或基类)的属性和方法。在 C# 中,使用冒号:来表示继承关系。例如:

class Animal
{
    public string Name { get; set; }
    public void Eat()
    {
        Console.WriteLine($"{Name}正在吃东西");
    }
}

class Dog : Animal
{
    public void Bark()
    {
        Console.WriteLine($"{Name}在汪汪叫");
    }
}

在上述代码中,Dog类继承自Animal类,这意味着Dog类自动拥有了Animal类的Name属性和Eat方法,同时还可以定义自己特有的Bark方法。

1.2 继承的特性

成员继承:子类会继承父类的公共(public)和受保护(protected)成员,但构造函数和析构函数不会被继承。其中,public成员可以被任何对象访问;protected成员只能被该类本身及其子类对象访问。

构造函数调用顺序:当创建子类对象时,系统会首先调用父类的构造函数,然后再调用子类的构造函数。如果子类构造函数需要调用父类的特定构造函数,可以使用base关键字。例如:

class Animal
{
    public Animal()
    {
        Console.WriteLine("Animal的构造函数被调用");
    }
}

class Dog : Animal
{
    public Dog() : base()
    {
        Console.WriteLine("Dog的构造函数被调用");
    }
}

执行new Dog();时,会先输出 “Animal 的构造函数被调用”,再输出 “Dog 的构造函数被调用” 。

使用base关键字:在子类中,base关键字用于访问父类的成员。当子类需要调用父类中被重写的方法,或者访问父类的属性时,就可以使用base关键字。例如:

class Animal
{
    public virtual void Move()
    {
        Console.WriteLine("动物在移动");
    }
}

class Dog : Animal
{
    public override void Move()
    {
        base.Move();// 调用父类的Move方法
        Console.WriteLine("狗在奔跑");
    }
}

1.3 方法重写(override)

方法重写是指在子类中重新定义父类中已有的虚方法(使用virtual关键字声明的方法)。重写后的方法需要使用override关键字声明,并且方法签名(方法名、参数列表和返回类型)必须与父类中的虚方法一致。例如:

class Shape
{
    public virtual void Draw()
    {
        Console.WriteLine("绘制一个形状");
    }
}

class Circle : Shape
{
    public override void Draw()
    {
        Console.WriteLine("绘制一个圆形");
    }
}

在这个例子中,Circle类重写了Shape类的Draw方法,当调用Circle对象的Draw方法时,会执行Circle类中重写后的方法。

1.4 继承的优点

代码复用:通过继承,子类可以复用父类的代码,减少重复代码的编写,提高开发效率。例如多个具有相似属性和行为的类,可以提取共同部分到父类,子类只需继承并扩展自己特有的部分。

增强代码的可维护性:当需要修改某个功能时,只需在父类中进行修改,所有子类都会受到影响,而不需要逐个修改每个子类的代码。

体现层次结构关系:清晰地展示了类之间的层次结构,使代码结构更加清晰,易于理解和扩展。

二、C# 多态

2.1 多态的定义与概念

多态是指同一个行为具有多个不同表现形式或形态的能力。在 C# 中,多态主要通过虚方法和抽象类来实现。简单来说,就是可以使用父类的引用来调用子类中重写的方法,在运行时根据对象的实际类型来决定调用哪个类的方法。例如:

class Animal
{
    public virtual void MakeSound()
    {
        Console.WriteLine("动物发出声音");
    }
}

class Dog : Animal
{
    public override void MakeSound()
    {
        Console.WriteLine("汪汪汪");
    }
}

class Cat : Animal
{
    public override void MakeSound()
    {
        Console.WriteLine("喵喵喵");
    }
}

class Program
{
    static void Main()
    {
        Animal animal1 = new Dog();
        Animal animal2 = new Cat();

        animal1.MakeSound();// 调用Dog类的MakeSound方法
        animal2.MakeSound();// 调用Cat类的MakeSound方法
    }
}

在上述代码中,animal1和animal2虽然都是Animal类型的引用,但它们分别指向Dog和Cat对象,在调用MakeSound方法时,会根据对象的实际类型调用相应子类的方法,这就是多态的体现。

2.2 实现多态的要素

子类重写父类方法:子类必须重写父类中使用virtual关键字声明的虚方法,并且使用override关键字进行声明。

向上转型:将子类对象赋值给父类引用,即使用父类的类型来引用子类对象。例如Animal animal = new Dog(); ,这里将Dog对象赋值给Animal类型的变量animal ,这就是向上转型。

2.3 多态的优点

提高代码的可扩展性:当需要添加新的子类时,不需要修改大量现有的代码,只需要在新子类中重写相应的方法即可。例如在上述动物的例子中,如果要添加一个Pig类,只需要让Pig类继承自Animal类,并重写MakeSound方法,而不需要修改其他类的代码。

增强代码的可维护性:多态使得代码结构更加清晰,每个类只负责自己的功能实现,通过父类引用来调用不同子类的方法,减少了代码的耦合度,便于维护和修改。

提高代码的复用性:可以编写通用的代码,通过父类引用来处理不同子类的对象,实现代码的复用。例如可以编写一个方法,接收Animal类型的参数,然后在方法中调用MakeSound方法,这样这个方法就可以处理任何继承自Animal的子类对象。

三、总结

继承与多态是 C# 面向对象编程中非常重要的特性。继承允许我们复用已有的代码,构建清晰的类层次结构;多态则通过动态绑定,使程序在运行时能够根据对象的实际类型做出不同的行为,提高了代码的灵活性、可扩展性和可维护性。在实际的 C# 开发中,合理运用继承与多态,可以让我们的代码更加简洁、高效和易于维护。随着对 C# 学习的深入,还可以进一步探索抽象类、接口等与继承和多态相关的特性,以更好地发挥面向对象编程的优势 。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/963258.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

项目练习:重写若依后端报错cannot be cast to com.xxx.model.LoginUser

文章目录 一、情景说明二、解决办法 一、情景说明 在重写若依后端服务的过程中 使用了Redis存放LoginUser对象数据 那么,有存就有取 在取值的时候,报错 二、解决办法 方法1、在TokenService中修改如下 getLoginUser 方法中:LoginUser u…

C语言------二维数组指针从入门到精通

前言: 目标:需要了解及掌握数组指针的行地址、列地址、具体元素地址、具体元素地址的值是怎样定义及实现。 重点:指针的偏移,指针解引用。 难点:指针的升阶与降阶。 1. 基本概念 二维数组:二维数组可以看作是一个数组的数组。例如,int a[3][4] 表示一个 …

AI-ISP论文Learning to See in the Dark解读

论文地址:Learning to See in the Dark 图1. 利用卷积网络进行极微光成像。黑暗的室内环境。相机处的照度小于0.1勒克斯。索尼α7S II传感器曝光时间为1/30秒。(a) 相机在ISO 8000下拍摄的图像。(b) 相机在ISO 409600下拍摄的图像。该图像存在噪点和色彩偏差。©…

自定义数据集 ,使用朴素贝叶斯对其进行分类

代码: # 导入必要的库 import numpy as np import matplotlib.pyplot as plt# 定义类1的数据点,每个数据点是二维的坐标 class1_points np.array([[1.9, 1.2],[1.5, 2.1],[1.9, 0.5],[1.5, 0.9],[0.9, 1.2],[1.1, 1.7],[1.4, 1.1]])# 定义类2的数据点&…

蓝桥杯单片机第七届省赛

前言 这套题不难,相对于第六套题这一套比较简单了,但是还是有些小细节要抓 题目 OK,以上就是全部的题目了,这套题目相对来说逻辑比较简单,四个按键,S4控制pwm占空比,S5控制计时时间&#xff0…

小程序设计和开发:如何研究同类型小程序的优点和不足。

一、确定研究目标和范围 明确研究目的 在开始研究同类型小程序之前,首先需要明确研究的目的。是为了改进自己的小程序设计和开发,还是为了了解市场趋势和用户需求?不同的研究目的会影响研究的方法和重点。例如,如果研究目的是为了…

反向代理模块jmh

1 概念 1.1 反向代理概念 反向代理是指以代理服务器来接收客户端的请求,然后将请求转发给内部网络上的服务器,将从服务器上得到的结果返回给客户端,此时代理服务器对外表现为一个反向代理服务器。 对于客户端来说,反向代理就相当…

一文讲解HashMap线程安全相关问题

HashMap不是线程安全的,主要有以下几个问题: ①、多线程下扩容会死循环。JDK1.7 中的 HashMap 使用的是头插法插入元素,在多线程的环境下,扩容的时候就有可能导致出现环形链表,造成死循环。 JDK 8 时已经修复了这个问…

oracle:子查询

子查询: 一条查询语句中嵌入了另一条查询语句, 被嵌入里面的这条查询语句称为子查询, 外面的查询语句称为主查询 子查询的分类 相关性子查询(Correlated Subquery)是指子查询的执行依赖于外部查询的每一行数据。也就是说,子查询会对外部查询…

AI技术在SEO关键词优化中的应用策略与前景展望

内容概要 在数字营销的快速发展中,AI技术逐渐成为SEO领域的核心驱动力。其通过强大的数据分析和处理能力,不仅改变了我们优化关键词的方式,也提升了搜索引擎优化的效率和效果。在传统SEO中,关键词的选择与组合常依赖人工经验和直…

Java项目: 基于SpringBoot+mybatis+maven+mysql实现的疫苗发布和接种预约管理系统(含源码+数据库+开题报告+毕业论文)

一、项目简介 本项目是一套基于SpringBootmybatismavenmysql疫苗发布和接种预约管理系统 包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经过严格调试,eclipse或者idea 确保可以运行! 该系统功能完善、…

VSCode中快速创建Html文件

1、下载并安装好VSCode软件,启动软件。 2、依次点击左上角选项卡“file”-“New File”。 输入文件名称后缀,如:HelloWorld.html。 选择新建文件的目录所在位置。 3、HelloWorld.html中输入英文格式的!,按回车键后会默认依据…

CMake项目编译与开源项目目录结构

Cmake 使用简单方便,可以跨平台构建项目编译环境,尤其比直接写makefile简单,可以通过简单的Cmake生成负责的Makefile文件。 如果没有使用cmake进行编译,需要如下命令:(以muduo库echo服务器为例)…

网络原理(4)—— 网络层详解

目录 一. IP协议报头结构 二. 地址管理 2.1 路由器 2.1.1 路由选择 2.1.2 WAN口(Wide Area Network) 2.1.3 LAN口(Local Area Network) 2.1.4 WLAN口(Wireless Local Area Network) 2.2 网段划分…

Hot100之图论

200岛屿数量 题目 思路解析 把访问过的格子插上棋子 思想是先污染再治理,我们有一个inArea()函数,是判断是否出界了 我们先dfs()放各个方向遍历,然后我们再把这个位置标为0 我们岛屿是连着…

【HarmonyOS之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(三)

目录 1 -> 生命周期 1.1 -> 应用生命周期 1.2 -> 页面生命周期 2 -> 资源限定与访问 2.1 -> 资源限定词 2.2 -> 资源限定词的命名要求 2.3 -> 限定词与设备状态的匹配规则 2.4 -> 引用JS模块内resources资源 3 -> 多语言支持 3.1 -> 定…

Python从零构建macOS状态栏应用(仿ollama)并集成AI同款流式聊天 API 服务(含打包为独立应用)

在本教程中,我们将一步步构建一个 macOS 状态栏应用程序,并集成一个 Flask 服务器,提供流式响应的 API 服务。 如果你手中正好持有一台 MacBook Pro,又怀揣着搭建 AI 聊天服务的想法,却不知从何处迈出第一步,那么这篇文章绝对是你的及时雨。 最终,我们将实现以下功能: …

【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】2.4 索引优化:避免意外复制的高效技巧

2.4 索引优化:避免意外复制的高效技巧 目录/提纲 #mermaid-svg-hmMAIqF8kFh46fbH {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-hmMAIqF8kFh46fbH .error-icon{fill:#552222;}#mermaid-svg-hmMAIqF8kF…

【C语言进阶(五)】指针进阶详解(下)

指针详解-下 1. 前言2. 函数指针数组2.1 函数指针数组的用途 3. 指向函数指针数组的指针3.1 回调函数 4. 库函数中qsort分析4.1 为什么这个函数需要我们自己实现?4.2 库函数qsort的使用 5. qsort函数的模拟实现5.1 大框架的实现5.2 比较函数的实现5.3 对于交换函数的思考5.4 交…

18.Word:数据库培训课程❗【34】

目录 题目 NO1.2.3.4 NO5设置文档内容的格式与样式 NO6 NO7 NO8.9 NO10.11标签邮件合并 题目 NO1.2.3.4 FnF12:打开"Word素材.docx”文件,将其另存为"Word.docx”在考生文件夹下之后到任务9的所有操作均基于此文件:"Word.docx”…