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# 学习的深入,还可以进一步探索抽象类、接口等与继承和多态相关的特性,以更好地发挥面向对象编程的优势 。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机毕业设计Python动漫推荐系统 漫画推荐系统 动漫视频推荐系统 机器学习 bilibili动漫爬虫 数据可视化 数据分析 大数据毕业设计

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…

2025年02月02日Github流行趋势

项目名称:oumi 项目地址url:https://github.com/oumi-ai/oumi 项目语言:Python 历史star数:1416 今日star数:205 项目维护者:xrdaukar, oelachqar, taenin, wizeng23, kaisopos 项目简介:构建最…

谭浩强C语言程序设计(3) 7章

1、递归实现N的阶乘 c复制 #include <cstdio> // 包含标准输入输出库// 计算n的阶乘 int total 0; // 定义全局变量total用于存储阶乘结果// 递归函数计算阶乘 int fac(int a){// 如果输入的数小于0&#xff0c;输出错误信息if (a < 0){printf("%d < 0,err…

python算法和数据结构刷题[2]:链表、队列、栈

链表 链表的节点定义&#xff1a; class Node():def __init__(self,item,nextNone):self.itemitemself.nextNone 删除节点&#xff1a; 删除节点前的节点的next指针指向删除节点的后一个节点 添加节点&#xff1a; 单链表 class Node():"""单链表的结点&quo…

网络工程师 (13)时间管理

一、定义与重要性 项目时间管理是指为确保项目按时完成而采取的一系列规划、安排和控制活动。它始于项目启动阶段&#xff0c;贯穿整个项目生命周期&#xff0c;直至项目结束。时间管理对于项目的成功至关重要&#xff0c;它有助于项目团队明确工作目标和时间节点&#xff0c;增…

2025.2.1——四、php_rce RCE漏洞|PHP框架

题目来源&#xff1a;攻防世界 php_rce 目录 一、打开靶机&#xff0c;整理信息 二、解题思路 step 1&#xff1a;PHP框架漏洞以及RCE漏洞信息 1.PHP常用框架 2.RCE远程命令执行 step 2&#xff1a;根据靶机提示&#xff0c;寻找版本漏洞 step 3&#xff1a;进行攻击…

记录 | 基于MaxKB的文字生成视频

目录 前言一、安装SDK二、创建视频函数库三、调试更新时间 前言 参考文章&#xff1a;如何利用智谱全模态免费模型&#xff0c;生成大家都喜欢的图、文、视并茂的文章&#xff01; 自己的感想 本文记录了创建文字生成视频的函数库的过程。如果想复现本文&#xff0c;需要你逐一…

Error: Expected a mutable image

你的函数用了不支持的图片格式比如我的人脸检测&#xff0c;本来要RGB565我却用JPEG所以报错

深度学习查漏补缺:1.梯度消失、梯度爆炸和残差块

一、梯度消失 梯度消失的根本原因在于 激活函数的性质和链式法则的计算&#xff1a; 激活函数的导数很小&#xff1a; 常见的激活函数&#xff08;例如 Sigmoid 和 Tanh&#xff09;在输入较大或较小时&#xff0c;输出趋于饱和&#xff08;Sigmoid 的输出趋于 0 或 1&#xf…

c++可变参数详解

目录 引言 库的基本功能 va_start 宏: va_arg 宏 va_end 宏 va_copy 宏 使用 处理可变参数代码 C11可变参数模板 基本概念 sizeof... 运算符 包扩展 引言 在C编程中&#xff0c;处理不确定数量的参数是一个常见的需求。为了支持这种需求&#xff0c;C标准库提供了 &…

【自学嵌入式(8)天气时钟:天气模块开发、主函数编写】

天气时钟&#xff1a;天气模块开发、主函数编写 I2C协议和SPI协议I2C&#xff08;Inter-Integrated Circuit&#xff09;SPI&#xff08;Serial Peripheral Interface&#xff09; 天气模块心知天气预报使用HTTPClient类介绍主要功能常用函数注意事项 JSON介绍deserializeJson函…

SpringBoot的配置(配置文件、加载顺序、配置原理)

文章目录 SpringBoot的配置(配置文件、加载顺序、配置原理)一、引言二、配置文件1、配置文件的类型1.1、配置文件的使用 2、多环境配置 三、加载顺序四、配置原理五、使用示例1、配置文件2、配置类3、控制器 六、总结 SpringBoot的配置(配置文件、加载顺序、配置原理) 一、引言…

政务行业审计文件大数据高速报送解决方案

随着信息技术的快速发展&#xff0c;电子政务迎来了新的升级浪潮。国家相继出台了一系列信息化发展战略规划&#xff0c;如《国家信息化发展战略纲要》、《“十三五”国家信息化规划》等&#xff0c;这些政策为政务信息化工作指明了方向。 然而&#xff0c;在实际操作中&#x…

GMSL 明星产品之 MAX96724

上一篇文章中&#xff0c;我们介绍了摄像头侧 GMSL 加串器 MAX96717. 今天我们来介绍下 GMSL 解串器明星产品 MAX96724&#xff1a; 可将四路 GMSL™2/1 输入转换为 1 路、2 路或 4 路 MIPI D-PHY 或 C-PHY 输出。该器件支持通过符合 GMSL 通道规范的 50Ω 同轴电缆或 100Ω 屏…

机器学习--概览

一、机器学习基础概念 1. 定义 机器学习&#xff08;Machine Learning, ML&#xff09;&#xff1a;通过算法让计算机从数据中自动学习规律&#xff0c;并利用学习到的模型进行预测或决策&#xff0c;而无需显式编程。 2. 与编程的区别 传统编程机器学习输入&#xff1a;规…

MySQL5.5升级到MySQL5.7

【卸载原来的MySQL】 cmd打开命令提示符窗口&#xff08;管理员身份&#xff09;net stop mysql&#xff08;先停止MySQL服务&#xff09; 3.卸载 切换到原来5.5版本的bin目录&#xff0c;输入mysqld remove卸载服务 测试mysql -V查看Mysql版本还是5.5 查看了环境变量里的…

java SSM框架 商城系统源码(含数据库脚本)

商城购物功能&#xff0c;项目代码&#xff0c;mysql脚本&#xff0c;html等静态资源在压缩包里面 注册界面 登陆界面 商城首页 文件列表 shop/.classpath , 1768 shop/.project , 1440 shop/.settings/.jsdtscope , 639 shop/.settings/org.eclipse.core.resources.prefs , …

【PyTorch】3.张量类型转换

个人主页&#xff1a;Icomi 在深度学习蓬勃发展的当下&#xff0c;PyTorch 是不可或缺的工具。它作为强大的深度学习框架&#xff0c;为构建和训练神经网络提供了高效且灵活的平台。神经网络作为人工智能的核心技术&#xff0c;能够处理复杂的数据模式。通过 PyTorch&#xff0…

用 HTML、CSS 和 JavaScript 实现抽奖转盘效果

顺序抽奖 前言 这段代码实现了一个简单的抽奖转盘效果。页面上有一个九宫格布局的抽奖区域&#xff0c;周围八个格子分别放置了不同的奖品名称&#xff0c;中间是一个 “开始抽奖” 的按钮。点击按钮后&#xff0c;抽奖区域的格子会快速滚动&#xff0c;颜色不断变化&#xf…

deepseek的两种本地使用方式

总结来说 ollama是命令行 GPT4ALL桌面程序。 然后ollamaAnythingLLM可以达到桌面或web的两种接入方式。 一. ollama和deepseek-r1-1.5b和AnythingLLM 本文介绍一个桌面版的deepseek的本地部署过程&#xff0c;其中ollama可以部署在远程。 1. https://www.cnblogs.com/janeysj/p…