C#中的封装、继承和多态

1.引言

在面向对象的编程中,封装、继承和多态是三个重要的概念。它们是C#语言中的基本特性,用于设计和实现具有高内聚和低耦合的代码。本文将详细介绍C#中的封装、继承和多态的相关知识。


在这里插入图片描述


目录

    • 1.引言
    • 2. 封装
      • 2.1 类
      • 2.2 访问修饰符
    • 3. 继承
    • 4. 多态
      • 4.1 虚方法
      • 4.2 抽象类
      • 4.3 接口
    • 5. 总结


2. 封装

封装是一种将数据和方法组合到一个单元中的机制,以实现信息隐藏和访问控制的目的。在C#中,封装通过使用类和访问修饰符来实现。

2.1 类

类是C#中封装的基本单位。一个类是一个抽象的数据类型,它定义了一组属性和方法。属性表示类的状态,而方法表示类的行为。通过使用类,我们可以将相关的数据和方法组合起来,形成一个具有特定功能的实体。

下面是一个示例类的定义:

public class Person
{
    private string name;
    private int age;

    public string Name
    {
        get { return name; }
        set { name = value; }
    }

    public int Age
    {
        get { return age; }
        set { age = value; }
    }
}

在上面的例子中,Person类包含了两个私有字段name和age,以及对应的公有属性Name和Age。私有字段只能在类内部访问,而公有属性可以被其他类访问和修改。这样就实现了对数据的封装。

2.2 访问修饰符

在C#中,访问修饰符用于控制类成员的访问权限。常用的访问修饰符有public、private、protected和internal。

  • public:表示公有的,可以在任何地方访问。
  • private:表示私有的,只能在类内部访问。
  • protected:表示受保护的,可以在类内部和派生类中访问。
  • internal:表示只能在当前程序集内访问。

通过使用适当的访问修饰符,可以实现对类成员的合理封装,提高代码的安全性和可维护性。


3. 继承

继承是一种通过定义一个新的类来扩展已有类的机制。通过继承,一个类可以获得父类的属性和方法,并重新定义或扩展它们。在C#中,继承使用关键字classbase来实现。

下面是一个示例类的继承:

public class Student : Person
{
    private string school;

    public string School
    {
        get { return school; }
        set { school = value; }
    }

    public void Study()
    {
        Console.WriteLine("I am studying at " + school);
    }
}

在上面的例子中,Student类继承自Person类,并新增了一个学校属性和一个学习方法。通过继承,Student类可以使用Person类中的属性和方法,同时还可以扩展新的功能。


4. 多态

多态是一种允许同一个方法在不同对象上产生不同结果的特性。在C#中,多态通过虚方法、抽象类和接口来实现。
在这里插入图片描述

4.1 虚方法

在基类中声明为virtual的方法可以在派生类中被重写。当调用被重写的方法时,实际执行的是对应派生类的方法。

下面是一个示例:

public class Shape
{
    public virtual void Draw()
    {
        Console.WriteLine("Drawing a shape");
    }
}

public class Circle : Shape
{
    public override void Draw()
    {
        Console.WriteLine("Drawing a circle");
    }
}

public class Rectangle : Shape
{
    public override void Draw()
    {
        Console.WriteLine("Drawing a rectangle");
    }
}

在上面的例子中,Shape类中的Draw方法声明为virtual,而Circle类和Rectangle类分别重写了该方法。当调用Draw方法时,实际执行的是对应派生类的方法。

4.2 抽象类

抽象类是一种不能被实例化的类,只能被继承,并且可以包含抽象成员和具体成员。抽象成员必须在派生类中被实现。

下面是一个示例:

public abstract class Shape
{
    public abstract void Draw();
}

public class Circle : Shape
{
    public override void Draw()
    {
        Console.WriteLine("Drawing a circle");
    }
}

public class Rectangle : Shape
{
    public override void Draw()
    {
        Console.WriteLine("Drawing a rectangle");
    }
}

在上面的例子中,Shape类是一个抽象类,其中的Draw方法是一个抽象成员。Circle类和Rectangle类必须实现Draw方法,否则编译将报错。

4.3 接口

接口是一种定义了一组成员的类型,不包含具体的实现。一个类可以实现多个接口,并提供对应成员的具体实现。

下面是一个示例:

public interface IDrawable
{
    void Draw();
}

public class Circle : IDrawable
{
    public void Draw()
    {
        Console.WriteLine("Drawing a circle");
    }
}

public class Rectangle : IDrawable
{
    public void Draw()
    {
        Console.WriteLine("Drawing a rectangle");
    }
}

在上面的例子中,IDrawable接口定义了Draw方法,而Circle类和Rectangle类实现了该接口,并提供了具体的实现。


5. 总结

封装通过类和访问修饰符实现数据和方法的封装;继承通过基类和派生类实现代码的扩展和重用;多态通过虚方法、抽象类和接口实现同一方法在不同对象上产生不同结果的特性。这些特性使得我们能够编写出更加灵活和可扩展的代码。希望本文对你理解C#中的封装、继承和多态有所帮助。

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

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

相关文章

高云GW1NSR-4C开发板M3核串口通信

1.PLLVR频率计算 高云的M3核要用到PLLVR核,其输出频率FCLKIN*(FBDIV_SEL1)/(IDIV_SEL1),但同时要满足FCLKIN*(FBDIV_SEL1)*ODIV_SEL)/(IDIV_SEL1)的值在600MHz和1200MHz之间。例如官方示例,其输入频率FCLKIN50MHz,要输出80MHz&am…

鸿蒙原生应用/元服务开发-Stage模型能力接口(三)

一、说明 AbilityLifecycleCallback模块提供应用上下文ApplicationContext的生命周期发生变化时触发相应回调的能力,包括onAbilityCreate、onWindowStageCreate、onWindowStageActive、onWindowStageInactive、onWindowStageDestroy、onAbilityDestroy、onAbilityFo…

一文弄懂自编码器 -- Autoencoders

1. 引言 近年来,自编码器(Autoencoder)一词在许多人工智能相关的研究论文、期刊和学位论文中被频繁提及。自动编码器于1980年推出,是一种用于神经网络的无监督学习技术,可以从未被标注的训练集中学习。 本文重点介绍…

指针进阶篇

指针的基本概念: 指针是一个变量,对应内存中唯一的一个地址指针在32位平台下的大小是4字节,在64位平台下是8字节指针是有类型的,指针类型决定该指针的步长,即走一步是多长指针运算:指针-指针表示的是两个指…

协方差和相关系数,还有信号与系统里的 互相关函数

协方差和相关系数参考:https://www.bilibili.com/video/BV1vK411N7Yp/ 协方差和相关系数的思想就是:同增同减,找相关的变量 协方差公式是如下图老师的板书 可以发现,当 X Y 同增同减趋势明显时,协方差的值就越大 所…

STM32_启动流程详解

目录标题 前言 启动流程概述复位中断函数详解SystemInit函数详解 __main函数详解 附录 stm32单片机的存储器映像中断向量表的映射 前言 最近在学习IAP远程OTA升级单片机固件程序,发现自己对单片机的启动流程还不是那么了解,就总结整理一下吧。 启动流程…

记录一次API报文替换点滴

1. 需求 各位盆友在日常开发中,有没有遇到上游接口突然不合作了,临时需要切换其他接口的情况?这不巧了,博主团队近期遇到了,又尴尬又忐忑。 尴尬的是临时通知不合作了,事前没有任何提醒; 忐忑…

位图、布隆过滤器、海量数据处理

文章目录 位图布隆过滤器海量数据处理 正文开始前给大家推荐个网站,前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 位图 概念:所谓位图,就是用每一…

【Spring】08 BeanNameAware 接口

文章目录 1. 简介2. 作用3. 使用3.1 创建并实现接口3.2 配置 Bean 信息3.3 创建启动类3.4 启动 4. 应用场景总结 Spring 框架为开发者提供了丰富的扩展点,其中之一就是 Bean 生命周期中的回调接口。本文将聚焦于其中的一个接口 BeanNameAware,介绍它的作…

深度学习中的预测图片中的矩形框、标签、置信度分别是什么意思。

问题描述:深度学习中的预测图片中的矩形框、标签、置信度分别是什么意思。 问题解答: 目标框(Bounding Box): 描述目标位置的矩形边界框。 类别标签: 表示模型认为目标属于哪个类别(例如&#…

opencv 十六 python下各种连通域处理方法(按面积阈值筛选连通域、按面积排序筛选连通域、连通域分割等方法)

本博文基于python-opencv实现了按照面积阈值筛选连通域、按照面积排序筛选topK连通域、 连通域细化(连通域骨架提取)、连通域分割(基于分水岭算法使连通域在细小处断开)、按照面积排序赛选topK轮廓等常见的连通域处理代码。并将代码封装为shapeUtils类,在自己的python代码…

[Verilog] 设计方法和设计流程

主页: 元存储博客 文章目录 1. 设计方法2. 设计流程 3 Vivado软件设计流程总结 1. 设计方法 Verilog 的设计多采用自上而下的设计方法(top-down)。设计流程是指从一个项目开始从项目需求分析,架构设计,功能验证&#…

openEuler商业化进展可观:累计装机量超610万套,市场持续扩容

12月15日至16日,以“崛起数字时代,引领数智未来”为主题的操作系统大会&openEuler Summit 2023在北京国家会议中心举办。大会旨在汇聚全球产业界创新力量,构筑坚实的基础软件根基,推动基础软件技术持续创新&#xff0c…

Redis设计与实现之整数集合

目录 一、内存映射数据结构 二、整数集合 1、整数集合的应用 2、数据结构和主要操作 3、intset运行实例 创建新intset 添加新元素到 intset 添加新元素到 intset(不需要升级) 添加新元素到 intset (需要升级) 4、升级 升级实例 5、关于升级 …

帆软FCRP模拟题

制作步骤可见此博主:https://blog.csdn.net/Ipkiss_Yongheng/article/details/125594366 完成文件下载:【免费】帆软FCRP官网模拟题代码资源-CSDN文库

大创项目推荐 垃圾邮件(短信)分类算法实现 机器学习 深度学习

文章目录 0 前言2 垃圾短信/邮件 分类算法 原理2.1 常用的分类器 - 贝叶斯分类器 3 数据集介绍4 数据预处理5 特征提取6 训练分类器7 综合测试结果8 其他模型方法9 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 垃圾邮件(短信)分类算…

5个创建在线帮助文档的好方法!

在线帮助文档是企业为用户提供支持服务的重要工具,它能够帮助用户更好地了解和使用产品,提高用户体验。然而,创建一份优秀的在线帮助文档需要掌握一定的技巧和方法。接下来就介绍一下创建在线帮助文档的5个好方法,帮助企业更好地为…

day05-报表技术-图形报表

1、图表报表简介 ​ 在大数据时代,人们需要对大量的数据进行分析,帮助用户或公司领导更直观的察觉差异,做出判断,减少时间成本,而在web项目中除了表格显示数据外,还可以通过图表来表现数据,这种…

一维数组的定义

什么是数组? (1)数组是具有一定顺序关系的若干变量的集合,组成数组的各个变量统称为数组的元素 (2)数组中的各元素的数据类型要求相同,用数组名和下标确定,数组可以是一维的&#…

【java】数组遍历的方式:

文章目录 1、for循环遍历:2、forEach循环(增强for循环):3、while循环 或者 do while循环:4、利用Arrays工具类当中的toString():5、流式遍历:6、使用Arrays.asList()和forEach()方法进行遍历: 1、for循环遍…