C#基础——面向对象(封装 继承 多态)

C# 属于面向对象编程,所谓"万物皆对象"。

面向对象编程的三大特性:封装、继承、多态。

1、封装:封装是一种将数据和方法包含在类中的机制,以避免外部代码直接访问和修改类的内部数据。可以使用访问修饰符(public、private、protected和 internal 等)来控制数据和方法的可见性和访问级别。

//类能够较好的体现封装的特点
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; }}public void SayHello(){Console.WriteLine("Hello, my name is " + name + " and I am " + age + " years old.");}
}// 使用封装后的类
Person person = new Person();
person.Name = "郭贝贝同学";
person.Age = 18;
person.SayHello(); // 输出:Hello, my name is 郭贝贝同学 and I am 18 years old.

2、继承:继承是一种从已有类派生新类的机制,新类继承了已有类的特征和行为,并且可以增加或修改新类的特征和行为。C#中支持单层继承和多层继承。

Object 属于基类:所有引用类型的基础类。Object没有有特点的属性和方法,只是为所有的类提供了一个基础。例如:Array类,继承自Object,叫做Object的派生类,他们之间的关系构成了继承关系

//创建一个People类
//假设:People属于基类(父类),提供了人类需要具备的属性和行为。
internal class People {public int Age { get; set; }public string Name { get; set; }public float Height { get; set; }//私有属性private decimal Money = 10000000;//声明构造函数public People() {Console.WriteLine("People类的构造函数");}//重构一个构造函数public People(int age, string name, float height) {Console.WriteLine("People类的构造函数222");this.Age = age;this.Name = name;this.Height = height;}//方法public void Speak() {//如果继承的时候该方法被子类调用,this指的是子类对象。Console.WriteLine("我叫{0}", this.Name);}
}
//当 :People 加上去之后,就表示当前Man类属于People类的子类(派生类),具备了继承的特性
internal class Man : People {// 子类除了可能继承父类的属性以外,也可以拓展属于自己的属性public string huzi;//子类也可以定义私有方法public void drink(string tea) {Console.WriteLine("{0}正在悠哉的喝着{1}", Name, tea);}//子类的构造函数public Man() {Console.WriteLine("这是Man的构造函数");}//构造函数重构public Man(int age, string name, float height) {//隐式执行了 new People();Name = name;Age = age;Height = height;}
}Man superMan = new Man();//即使Man中并没有声明Name属性,但是因为是继承自People类的所以可以直接使用superMan.Name = "郭贝贝";// huzi就属于自己的属性,子类的属性只允许自身访问,父类People是没办法访问的。superMan.huzi = "关公胡";//方法和属性一样,只要公开了,都会继承过来superMan.Speak(); //注意此处的Speak方法是基类的,在这里也可以调用 superMan.drink("毛尖茶");//使用子类自身的构造函数Man man = new Man(19, "小郭", 1.82f);Console.WriteLine($"我叫{man.Name},今年{man.Age}岁,我的身高是{man.Height}米。");//父类中的私有属性是不能被继承的
//superman.Money = 10000; //报错

以上代码示例只是单层继承

下面示例是在上面代码基础上实现多层继承

//在上面代码中我们可以看到继承关系是 Man : People
internal class Women : Man { } //让Women 继承 Man
internal class Son : Women { } //让Son 继承 WomenSon ss = new Son();
ss.Name = "派生类的派生类"; 
Console.WriteLine(ss.Name); //儿子
ss.Speak(); //我叫派生类的派生类
//我们可以看到嵌套多层继承仍然可以实现

base 和 this 关键字

this和base都是用于引用对象的关键字。

this关键字表示当前对象的引用。在类的方法中使用this关键字可以明确指定成员变量或成员方法是属于当前对象的。在构造函数中使用this关键字可以调用同一个类的其他构造函数。

class MyClass
{private int x;public void SetX(int x){this.x = x; // 使用this关键字明确指定成员变量x属于当前对象}public int GetX(){return this.x; // 使用this关键字明确指定成员变量x属于当前对象}
}

base关键字用于引用基类的成员。在派生类中使用base关键字可以调用基类的构造函数或成员方法。

class MyBaseClass
{protected int x;public MyBaseClass(int x){this.x = x;}public void PrintX(){Console.WriteLine("x = " + this.x);}
}class MyDerivedClass : MyBaseClass
{public MyDerivedClass(int x) : base(x){// 调用基类的构造函数}public void PrintAll(){base.PrintX(); // 调用基类的成员方法Console.WriteLine("This is a derived class.");}
}

多态:同一个方法名可以在不同的对象上具有不同的行为。

多态性的实现主要依靠以下两个重要的概念:继承和方法重写。

继承(Inheritance):继承是面向对象编程的基本特性之一,它允许一个类派生出子类,并继承父类的属性和方法。子类可以重新定义(覆盖)父类的方法,也可以增加自己独有的方法。通过继承,可以创建一个通用的父类,并在子类中根据需要进行特定的实现。

方法重写(Method Overriding):方法重写是指在子类中重新定义与父类中具有相同名称和参数列表的方法。子类可以根据自身的需求重新实现该方法,从而改变方法的行为。通过方法重写,可以在不同的对象上调用相同的方法名,但实际执行的是各自类中的具体实现。

 internal class People {public int Age { get; set; }public string Name { get; set; }public void Eat() {Console.WriteLine("吃饱了");}// virtual:表示该方法是一个虚方法,这个方法其实我们在基类(父类)中只需要声明,将来要在派生类(子类)中实现。相当于在父类中定义,在子类中重写public virtual void Drink() {Console.WriteLine("喝晕了");}}class Man : People {//如果直接定义和父类中一样的方法,那么会把父类的方法覆盖掉public void Eat() {Console.WriteLine("没有吃饱");}//override 代表重写:把父类中的方法进行重新构造,不覆盖父类的方法。public override void Drink() {//如果想保留父类的方法 使用base调用父类的方法base.Drink();Console.WriteLine("我没喝多,再来一瓶");}public override string ToString() {Console.WriteLine("重写的是Object的方法");return base.ToString();}}Man man = new Man();//覆盖父类的方法man.Eat();//重写的方法man.Drink();man.Age = 20;//相当与在原有的ToString基础上拓展业务逻辑man.ToString();

重载与重写

重载:重载指的是在同一个类中定义多个具有相同名称但参数列表不同的方法或函数。重载方法可以根据不同的参数类型、参数数量或参数顺序来执行不同的操作。

public class Calculation {//定义一个方法public int sum(int num1, int num2) {return num1 + num2;}//定义一个名称相同,但参数列表不同的方法public float sum(float num1, float num2) {return num1 + num2;}//再次定义一个名称相同,但参数列表不同的方法public int sum(int num1, int num2, int num3) {return num1 + num2 + num3;}
}

重写:重写指的是在派生类中重新定义基类中已有的方法,以实现特定的行为。重写方法的名称、返回类型和参数列表必须与基类中的方法完全相同。

public class People{public virtual void Drink() {Console.WriteLine("我是基类的方法");}
}public class Man : People{public override void Drink() {Console.WriteLine("我是派生类的方法");}}

重写的必要条件:

  • 发生在继承关系中,派生类重写基类的方法。
  • 修饰符,方法名,返回值类型都需要一致。
  • 重写时,基类要有使派生类重写的修饰符,而派生类也要有重写修饰符override
  • 重写后,派生类的方法就覆盖了基类的方法,如果想保留基类方法,使用base调用

重写与重载的区别:

  • 相同点:方法名字必须相同,访问修饰符相同
  • 不同点:
    • 重载:在一个类中,并且参数列表不同,返回值无需要求,不用使用关键字就可以重载。
    • 重写:不在一个类中,是继承关系,参数列表相同,返回值类型不同,需要使用关键字。

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

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

相关文章

ROS-ROS运行管理-工作空间覆盖;节点、话题、参数名称重名

文章目录 一、工作空间覆盖二、节点名称重名2.1 rosrun设置命名空间与重映射2.2 launch文件设置命名空间与重映射2.3 编码设置命名空间与重映射 三、话题名称设置3.1 rosrun设置话题重映射3.2 launch文件设置话题重映射3.3 编码设置话题名称 四、参数名称设置4.1 rosrun设置参数…

Redis部署文档

Redis部署文档 简介 这份文档旨在指导如何在Docker环境中部署Redis。 步骤 1. 安装Docker和Docker Compose 确保在部署之前已经安装了Docker和Docker Compose。 2. 创建Docker Compose文件 在项目根目录创建一个docker-compose.yaml文件,并将以下内容复制到文…

[笔记] wsl2 下使用 qemu/grub 模拟系统启动(多分区)

首先创建一块虚拟硬盘: dd bs512 count204800 if/dev/zero ofhd.img然后使用 losetup -f 将其关联为本地回环设备 losetup -f hd.img # 关联 hd.img 到空闲回环设备上 losetup -a /dev/loop0: [2080]:409 (/root/code/demo05/hd.img) # 查看刚刚关联到了哪里,这里关联到了 /d…

Github与Gitlab

学习目标 能够使用GitHub创建远程仓库并使用能够安装部署GitLab服务器能够使用GitLab创建仓库并使用掌握CI/CD的概念掌握蓝绿部署, 滚动更新,灰度发布的概念 GitHub是目前最火的开源项目代码托管平台。它是基于web的Git仓库,提供公有仓库和私有仓库,但私…

使用Go实现一个百行聊天服务器

前段时间, redis作者不是整了个c语言版本的聊天服务器嘛, 地址, 代码量拢共不过百行. 于是, 心血来潮下, 我也整了个Go语言版本. 简单来说就是实现了一个聊天室的功能. 将所有注释空行都去掉, 刚好100行实现. 废话不多说, 先上代码: package mainimport ("fmt"&quo…

SoC中跨时钟域的信号同步设计(单比特同步设计)

一、 亚稳态 在数字电路中,触发器是一种很常用的器件。对于任意一个触发器,都由其参数库文件规定了能正常使用的“建立时间”(Setup time)和“保持时间”(Hold time )两个参数。“建立时间”是指在时钟…

【MySQL学习之基础篇】多表查询

文章目录 1. 多表关系1.1. 一对多1.2. 多对多1.3. 一对一 2. 多表查询概述2.1. 数据准备2.2. 概述 3. 查询的分类3.1. 内连接查询3.2. 外连接查询3.3. 自连接3.3.1. 自连接查询3.3.2. 联合查询 3.4. 子查询3.4.1. 概述3.4.2. 标量子查询3.4.3. 列子查询3.4.4. 行子查询3.4.5. 表…

python+requests+pytest 接口自动化实现

最近工作之余拿公司的项目写了一个接口测试框架,功能还不是很完善,算是抛砖引玉了,欢迎各位来吐槽。 主要思路: ①对 requests 进行二次封装,做到定制化效果 ②使用 excel 存放接口请求数据,作为数据驱动 ③…

LeetCode(60)K 个一组翻转链表【链表】【困难】

目录 1.题目2.答案3.提交结果截图 链接: K 个一组翻转链表 1.题目 给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。 k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍&#xf…

Modbus转Profinet网关使用方法

Modbus转Profinet网关(XD-MDPN100/200)是用于将Modbus协议和Profinet协议进行转换并进行通迅的设备。Modbus转Profinet网关(XD-MDPN100/200)无论是新项目还是改造项目都可轻松配置完成通迅互联。 正确的安装和配置对于确保设备的正…

低代码核心能力详解:简化应用开发的新思路

低代码平台作为一种快速地应用开发解决方法,为中小企业实现数字化转型提供了机会。但是,对于一些刚开始触碰低代码平台的企业来说,了解其核心能力是很重要的。本文将详细分析低代码平台的核心能力,并在挑选低代码平台以前为中小企…

云原生之深入解析OOM和CPU节流

一、前言 使用 Kubernetes 时,内存不足 (OOM) 错误和 CPU 节流是云应用程序中资源处理的主要难题,这是为什么呢?云应用程序中的 CPU 和内存要求变得越来越重要,因为它们与云成本直接相关。通过 limits 和 requests ,可…

航带模式拍完之后用重建大师跑出来的模型是弧形的,怎么处理?

答:空三设置-更多设置-定位方式中选择pos高精度,再跑一下看看。 重建大师是一款专为超大规模实景三维数据生产而设计的集群并行处理软件,输入倾斜照片,激光点云,POS信息及像控点,输出高精度彩色网格模型&a…

k8s-Pod

1、Pod 简介: (1) 概念: Pod 是 Kubernetes 中创建和管理的,最小的可部署的计算单元。Pod中存储了一组(一个或多个)容器,以及怎样运行这些容器的声明,这些容器共享存储、网络和环境&#xff0…

早上好,我的leetcode 【hash】(第二期)

写在前面:坚持才是最难的事情 C代码还是不方便写,改用python了,TAT 文章目录 1.两数之和49. 字母异位词分组128.最长连续序列 1.两数之和 你好,梦开始的地方~ https://leetcode.cn/problems/two-sum/description/?envTypestudy…

《打造第二大脑》—如何构建高效的笔记系统

最近看了一本书,因为我也用Obsidian来记笔记,(Obsidian之前有介绍过Obsidian使用教程(如何构建你的个人知识库,第二大脑))看完这本书后发现里面给的方法跟Obsidian很契合,所以就整理…

STM32单片机输出频率及占空比可调的PWM波

一、测试用环境 STM32F103C8T6&#xff0c;HAL库。 只考虑PWM的频率和占空比两个参数&#xff0c;死区、极性、对齐方式等不做讨论。 二、STM32Cube MX配置 1.PWM原理 上图中&#xff0c;定时器向上计数&#xff0c;当CNT<CCRx时&#xff0c;输出0&#xff0c;当CNT>C…

linux下的strerror和perror处理错误函数

strerror和perror是C语言中用于处理错误信息的函数。 strerror函数&#xff1a; strerror函数用于将错误码转换为对应的错误消息字符串。它接受一个整数参数&#xff0c;通常是由系统调用或库函数返回的错误码&#xff0c;然后返回一个描述该错误的字符串。 函数原型&#xff1…

PrimDiffusion:3D 人类生成的体积基元扩散模型NeurIPS 2023

NeurIPS2023 &#xff0c;这是一种用于 3D 人体生成的体积基元扩散模型&#xff0c;可通过离体拓扑实现明确的姿势、视图和形状控制。 PrimDiffusion 对一组紧凑地代表 3D 人体的基元执行扩散和去噪过程。这种生成建模可以实现明确的姿势、视图和形状控制&#xff0c;并能够在…

化学方程式小程序

brief introduction 相信大家上中学时都会被化学方程式折腾得死去活来&#xff0c;尤其是配平&#xff0c;怎么也算不对数字。于是我写出了这款近200行的自动配平程序&#xff0c;这是不是你们黑暗化学中的一丝光亮呢&#xff1f; usage 正常化学式输入&#xff0c;每一种物…