C#基础之面向对象编程(二)
总目录
文章目录
- 总目录
- 前言
- 一、概述
- 1. 定义
- 2. 面向对象的三大特性
- 二、封装
- 1. 定义
- 2. 属性
- 三、继承
- 1. 定义
- 2. 继承的使用
- 3. base 和this
- 四、多态
- 1. 定义
- 2. 重写和重载
- 3. 多态性的实现
- 1、静态多态性
- 2、动态多态性
- 4. 向上转型和向下转型
- 1、定义
- 2、语法格式
- 3、案例
- 结语
前言
本文主要用于供自身复习使用,上篇文章首先回顾了C#中的数据类型,数据转换以及数据之间进行运算的运算符,然后回顾了基本的流程控制语句if else,switch for,while等,最后还回顾了数组,枚举,结构体,类,接口,抽象类等基本的数据结构,本文将从面向对象编程的角度进一步的回顾相关知识。
一、概述
1. 定义
把现实世界中的对象使用代码的形式表现出来
2. 面向对象的三大特性
- 封装 - 体现了代码的可维护性
- 继承 - 体现了代码的可扩展性
- 多态 - 体现了代码的灵活性
二、封装
1. 定义
- 封装 被定义为"把一个或多个项目封闭在一个物理的或者逻辑的包中"。
- 在面向对象程序设计方法论中,封装是为了防止对实现细节的访问。
- 通俗说法:使用class,将变量和方法,包装到一个独立的程序单元中,一旦封装后,变量称之为属性,方法称为行为
2. 属性
变量封装到类中,分为两种形式:
字段:变量的声明,使用_标识
属性:使用get 和set 进行包装,一般首字母大写,符合驼峰命名规则
代码如下(示例):
class UserInfo{private string _id;public string Id{get { return _id; }set { _id = value; }}}
关于get 和set 的理解如下:
private int _id;public int Id{get//返回给外界的值,供外界调用读取的值 {if (_id < 0)//如果内部逻辑得出的_id<0,则同一返回0{_id = 0;}return _id; }set//供给外界设置的窗口,如果设置为private,外界将无法为该属性赋值,为只读属性{if (value>999)//value 即是外界赋予的值,可以通过set来处理外界的值{_id = 999;//如果外界赋予的值大于999,则统一修正为999}_id = value;}}
三、继承
1. 定义
- 一个类通过申明沿用另一个类中,非私有的属性和行为。
- 被继承的类称之为 基类或父类,继承类称之为 派生类或子类
继承的可扩展性体现在:继承的时候,子类不仅沿用父类中非私有的属性和行为,还可增加自己特有的内容,另外通过重写和重载,同样实现了内容的扩展
注意 : 继承的时候,一个类只能有一个父类
2. 继承的使用
继承我们通过冒号(:)表示,表现形式如下:
class Shape{public void setWidth(int w){width = w;}public void setHeight(int h){height = h;}protected int width;protected int height;}// 派生类class Rectangle: Shape{//通过 Rectangle: Shape 的形式表示:Rectangle继承自Shape //由于Rectangle继承自Shape,就有了Shape中非私有的width和height变量以及setWidth和setHeightpublic int getArea(){return (width * height);}}class RectangleTester{static void Main(string[] args){Rectangle Rect = new Rectangle();Rect.setWidth(5);Rect.setHeight(7);// 打印对象的面积Console.WriteLine("总面积: {0}", Rect.getArea());Console.ReadKey();}}
3. base 和this
- 一般当前类使用this,子类使用父类的使用base
- 构造函数时不可继承的 ,只能去调用;因此子类使用父类的构造函数的时候,需要使用base
- 子类继承了父类的非私有的属性和行为,因此子类使用父类的非私有属性和行为的时候使用this
- 子类调用父类的方法,可使用base,也可使用this。主要是使用base的时候我们知道去父类找该方法,指向更明确
- 大多情况下,都省略的this和base关键字
四、多态
1. 定义
- 在面向对象编程范式中,多态性往往表现为"一个接口,多个功能"。
多态就是同一个接口,使用不同的实例而执行不同操作,如图所示
2. 重写和重载
重写:在子类中重新编写父类方法
重写具有相同的方法名、参数列表以及返回值
重写的方式有如下两种:
- 使用new 重写(也称覆盖)
- 使用vitual 和override 重写
class Animal{public void Eat(){Console.WriteLine("吃");}//定义虚方法,需子类重新,另外abstract 自带virtual属性public virtual void Action(){Console.WriteLine("行动");}}class Monkey:Animal{//通过new 重写父类的方法public new void Eat(){Console.WriteLine("猴子吃香蕉");}//通过override重写public override void Action(){base.Action();//重写后,可以通过base调出父类的原方法执行,也可不调用,重新实现Console.WriteLine("猴子上树");}}
重载:就是在同一个类中有多个同名方法,但是方法的参数列表不同
重载可以实现一种方法的多种实现方式,有利于程序的扩展。
class Animal{public void Eat(){Console.WriteLine("吃");}public void Eat(string food){Console.WriteLine($"吃{food}");}public void Eat(int num,string food){Console.WriteLine($"一天吃{num}次{food}");}public int Eat(string name ,int num,string food){Console.WriteLine($"{name}一天吃{num}次{food}");//如猴子一天吃三次香蕉,(假如一次2根),返回一天总量return num * 2 ;}}
3. 多态性的实现
- 多态性可以是静态的或动态的。
- 在静态多态性中,函数的响应是在编译时发生的。
- 在动态多态性中,函数的响应是在运行时发生的。
- 多态是建立在封装和继承的基础上的
1、静态多态性
静态多态性通过函数(方法)重载和运算符重载实现。
函数重载上面已经介绍了,这里介绍以下运算符的重载。
C# 允许用户定义的类型通过使用 operator 关键字定义静态成员函数来重载运算符。
注意必须用public修饰且必须是类的静态的方法。
运算符的重载可为用户自定义的对象实现运算。
运算符重载的使用案例如下:
class Rect{public double Width { get; set; }public double Length { get; set; }public static Rect operator+(Rect a,Rect b){Rect rect = new Rect();rect.Width = a.Width + b.Width;rect.Length = a.Length + b.Length;return rect;}public double GetArea(){return Width * Length;}}class Program{static void Main(string[] args){Rect RectA = new Rect() { Width=2.5,Length=4};Rect RectB = new Rect() { Width=3.5,Length=6};Console.WriteLine($"RectA的面积{RectA.GetArea()}");Console.WriteLine($"RectB的面积{RectB.GetArea()}");//如果没有通过operator+ 进行重载,RecA是无法和RecB进行相加的操作的Rect RectC = RectA+RectB;Console.WriteLine($"RectC的面积{RectC.GetArea()}");Console.ReadLine();}}
下图罗列了可重载和不可重载的运算符
这里解释以下成对重载,也就是说,如果我们重载了==,那么就必须连同 != 一起重载
详细使用如下:
class Program{static void Main(string[] args){Student student = new Student(15, "小栗子");var student1 = student + 3;var student2 = student + "新手小白";Console.WriteLine(student1.ToString());//年龄 = 18,名称 = 小栗子Console.WriteLine(student2.ToString());//年龄 = 15,名称 = 新手小白小栗子Student stu1 = new Student(12, "小张子");Student stu2 = new Student(18, "小王五");var stu3 = stu1 - stu2;Console.WriteLine(stu3.ToString()); //年龄 = 6,名称 = 小张子和小王五Console.ReadLine();}}public class Student{public int Age { get; set; }public string Name { get; set; }public Student(){ }public Student(int age, string name){this.Age = age;this.Name = name;}# 形如 public static Student operator +(int c1, int c2) 是会报错的# 因为这样,就与需要操作的Student类毫无关联!# 二元运算符的参数之一必须是包含类型(参数c1、c2中有一个类型为Student即可).//+重载 ,操作年龄public static Student operator +(Student stu, int c2){return new Student(stu.Age + c2, stu.Name);}//+重载 ,增加姓名前缀public static Student operator +(Student stu, string prefix){return new Student(stu.Age, prefix+stu.Name); }//重载运算符"-",计算两个学生的年龄差.public static Student operator -(Student a, Student b){return new Student(Math.Abs(a.Age - b.Age), $"{a.Name}和{b.Name}");}//重写ToString方法,格式化输出public override string ToString(){return $"年龄={Age},名称={Name}";}}
2、动态多态性
动态多态性是通过 抽象类、接口 和 虚方法 实现的。
- 抽象类 和 接口 综合案例如下:
abstract class Animal{public abstract void Run();//abstract 自带virtual属性}interface IFly//接口默认public,通常接口命名以 I 开头{void Fly();//飞翔这项功能作为一个接口,并不是所有动物都可以的}class Monkey : Animal{public override void Run(){Console.WriteLine("猴子在奔跑!");}}class Pig : Animal{public override void Run(){Console.WriteLine("小猪在狂奔!");}}//同一个方法(“接口”)Run,在不同的实例中有不同的实现就是多态的一种体现# 这里需要注意:当一个子类同时继承抽象类,类,和接口的时候,抽象类,类必须排在接口前面class Brid : Animal, IFly{public void Fly(){Console.WriteLine("奋飞的小鸟!");}public override void Run(){Console.WriteLine("愤怒的小鸡在奔跑!");}}
- 虚方法
class Worker{public virtual void DoWork(){Console.WriteLine("做工作!");}}class WorkerA : Worker{public override void DoWork(){base.DoWork();Console.WriteLine("编写项目ppt");}}
4. 向上转型和向下转型
1、定义
- 向上转型:将子类对象转为父类对象。此处父类对象可以是接口,抽象类。
- 向下转型:把父类对象转为子类对象。
- 向上转型和向下转型 就是针对同一个继承链中的两个类型的相互转换
2、语法格式
- 向上转型格式:父类类型 上转型变量 = new 子类类型();
- 向下转型格式:子类类型 下转型变量 = (子类类型)父类类型变量;
3、案例
class Worker{public virtual void DoWork(){Console.WriteLine("做工作!");}}class WorkerA : Worker{public override void DoWork(){base.DoWork();Console.WriteLine("编写项目ppt");}public void Avocation(){Console.WriteLine("WorkA的业余爱好");}}class Program{static void Main(string[] args){//向上转型Worker worker= new WorkerA();worker.DoWork();/* 输出:做工作!编写项目ppt*///worker.Avocation();//注意这里会报错:因为上转型变量是不可调用 子类中扩展的方法的,只能调用两者共有的方法//向下转型//这种情况是不合理的,因为相当于用父类替换子类,然而子类会有扩展,不可能完全替换//Worker wo = new Worker();//WorkerA wa = (WorkerA)wo;Worker wo = new WorkerA();WorkerA wa = (WorkerA)wo;wa.Avocation();//这样是可行的,因为自始至终实例都是WorkAwo.DoWork();/*WorkA的业余爱好做工作!编写项目ppt*/Console.ReadLine();}}
结语
以上就是本文的内容,希望以上内容可以帮助到您,如文中有不对之处,还请批评指正。
参考资料:
C# 运算符重载
菜鸟教程-C# 运算符重载
相关文章:
C#基础之面向对象编程(二)
总目录 文章目录总目录前言一、概述1. 定义2. 面向对象的三大特性二、封装1. 定义2. 属性三、继承1. 定义2. 继承的使用3. base 和this四、多态1. 定义2. 重写和重载3. 多态性的实现1、静态多态性2、动态多态性4. 向上转型和向下转型1、定义2、语法格式3、案例结语前言 本文主…...
蓝桥杯刷题冲刺 | 倒计时25天
作者:指针不指南吗 专栏:蓝桥杯倒计时冲刺 🐾马上就要蓝桥杯了,最后的这几天尤为重要,不可懈怠哦🐾 文章目录1.完全二叉树1.完全二叉树 题目 链接: 完全二叉树的权值 - 蓝桥云课 (lanqiao.cn) 给…...
c语言—动态内存管理
一.为什么存在动态内存开辟开辟空间的特点:空间开辟大小是固定的数组在申明时,必须指定数组长度,她所需要的内存在编译时分配但是对于空间的需求,不仅仅是上述的情况。有时候我们需要的空间大小在程序运行的时候才能知道ÿ…...
请说明Ajax、Fetch、Axios三者的区别
相同点: 1、三者都用于网络请求,但是不同维度 2、 Ajax(Asynchronous Javascript and XML),一种技术的统称,并不是实际的API 3、Fetch是一个具体的API,浏览器里面直接有一个API就叫Fetch 4、 Axios是一个第三方库&…...
阿里p8测试总监,让我们用这份《测试用例规范》,再也没加班过
经常看到无论是刚入职场的新人,还是工作了一段时间的老人,都会对编写测试用例感到困扰?例如: 固然,编写一份好的测试用例需要:充分的需求分析能力 理论及经验加持,作为测试职场摸爬打滚的老人&…...
【Unity】数据持久化路径Application.persistentDataPath
今天突然想到这个路径Application.persistentDataPath,热更的重要路径,该文件夹可读可写,在移动端唯一一个可读写操作的文件夹。移动端可以将本地的资源(资源MD5值配置表)等一些文件放到StreamingAssets文件夹下&#…...
华为OD机试 - 插队(Java JS Python)
题目描述 某银行将客户分为了若干个优先级, 1 级最高, 5 级最低,当你需要在银行办理业务时,优先级高的人随时可以插队到优先级低的人的前面。 现在给出一个人员到来和银行办理业务的时间序列,请你在每次银行办理业务时输出客户的编号。 如果同时有多位优先级相同且最高…...
MongoDB数据库从入门到精通系列之八:调整oplog大小
MongoDB数据库从入门到精通系列之八:调整oplog大小 一、oplog的概念二、oplog大小三、调整oplog大小详细步骤一、oplog的概念 操作日志oplog包含了主节点执行的每一次写操作。oplog是存在于主节点local数据库中的一个固定集合。从节点通过查询此集合以获取需要复制的操作。每个…...
PCL 间接平差法拟合二维直线
目录 一、算法原理二、代码实现三、结果展示四、相关链接一、算法原理 通过传统最小二乘法对点云数据进行二维直线拟合时,可将误差只归因于一个方向上,本文假设误差只存在于 y y y轴方向上,设点云拟合的二维直线方程为: y =...
进程调度的基本过程
这里写目录标题什么是进程进程管理结构体或类的主要属性pid内存指针文件描述符表辅助进程调度的属性并发并行并发什么是进程 进程是操作系统对一个正在运行的程序的一种抽象,也就是说,一个运行起来的程序就是一个进程。 进程又是操作系统进行资源分配的…...
python自动化办公(二)
上接python自动化办公(一) 文章目录文件和目录操作使用shutil库文件查找globfnmatchhashlib文件和目录操作 使用shutil库 shutil库也是Python标准库,它可以处理文件、文件夹、压缩包,能实现文件复制、移动、压缩、解压缩等功能。…...
Qt Quick - GridLayout 网格布局
GridLayout 理论总结一、概述二、依赖属性三、例子1. 不含跨行的2. 带跨行列的3. 从右到左一、概述 GridLayout 是最常用的布局器,也叫网格布局器,如果网格布局被调整大小,布局中的所有 Item 将被重新排列。它类似于基于widget的QGridLayout…...
安卓手机也可以使用新必应NewBing
没有魔法安卓手机也可以使用新必应NewBing 目前知道的是安卓手机 安卓手机先安装一个猴狐浏览器 打开手机自带浏览器,搜索关键词:猴狐浏览器,找到官网 也可以直接复制这个网址 狐猴浏览器 lemurbrowser CoolAPK 我的手机是荣耀安卓手机…...
支付系统设计:消息重试组件封装
文章目录前言一、重试场景分析一、如何实现重试1. 扫表2. 基于中间件自身特性3. 基于框架4. 根据公司业务特性自己实现的重试二、重试组件封装1. 需求分析2. 模块设计2.1 持久化模块1. 表定义2. 持久化接口定义3. 持久化配置类2.2 重试模块1.启动2.重试3. 业务端使用1. 引入依赖…...
Visual Studio 2022 c#中很实用的VS默认快捷键和原生功能
常常使用VS感觉还是有必要掌握其默认的快捷键,我这个人比较懒,不喜欢动不动就去设置快捷键,系统有就用,记住了就可以到处用,问题是像我们这种有很多个工作场所的人不可能每台电脑都去配置一下快键键。实际上我使用3dma…...
Python的30个编程技巧
1. 原地交换两个数字 Python 提供了一个直观的在一行代码中赋值与交换(变量值)的方法,请参见下面的示例: x,y 10,20 print(x,y) x,y y,x print(x,y) #1 (10, 20) #2 (20, 10) 赋值的右侧形成了一个新的元组,左侧立即解…...
MySQL:JDBC
什么是JDBC? JDBC( Java DataBase Connectivity ) 称为 Java数据库连接 ,它是一种用于数据库访问的应用程序 API ,由一组用Java语言编写的类和接口组成,有了JDBC就可以 用统一的语法对多种关系数据库进行访问,而不用担…...
C++【list容器模拟实现函数解析】
list容器&&模拟实现函数解析 文章目录list容器&&模拟实现函数解析一、list容器使用介绍二、list容器模拟实现及函数解析2.1 list结构体创建2.2 迭代器封装2.21 构造函数:2.22 前置和后置及- -2.23 解引用2.24 判断相等2.25 箭头重载2.26 第二个和第…...
(Java)试题 算法提高 约数个数
一、题目 (1)资源限制 内存限制:512.0MB C/C时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s (2)输入 输入一个正整数N (3)输出 N有几个约数 &a…...
魔法反射--java反射初入门(基础篇)
👳我亲爱的各位大佬们好😘😘😘 ♨️本篇文章记录的为 java反射初入门 相关内容,适合在学Java的小白,帮助新手快速上手,也适合复习中,面试中的大佬🙉🙉🙉。 ♨️如果文章有…...
概率统计_协方差的传播 Covariance Propagation
1. 方差的传播 误差的传播是指分析在形如的关系中,参量误差(x)对变量误差(y)的影响有多大。误差的传播与函数的微分紧密相关,本质是在利用当Δ x 不大时,。 方差计算公式: X为变量,为总体均值,N为总体例数。求变量X与均值的差的平方再求平均值,即得到方差。方差…...
大学生考研的意义?
当我拿起笔头,准备写这个话题时,心里是非常难受的,因为看到太多的学生在最好的年华,在自由的大学本应该开拓知识,提升认知,动手实践,不断尝试和试错,不断历练自己跳出学生思维圈&…...
【C++笔试强训】第三十一天
🎇C笔试强训 博客主页:一起去看日落吗分享博主的C刷题日常,大家一起学习博主的能力有限,出现错误希望大家不吝赐教分享给大家一句我很喜欢的话:夜色难免微凉,前方必有曙光 🌞。 选择题 &#x…...
toString()、equals()是什么,为啥需要重写,多种方法来重写
https://m.runoob.com/java/java-object-class.html toString() 1.为什么会有toString 子类继承父类就可以使用父类所有非私有的属性的方法。 在Java中所有类都直接或者间接继承Object类,可以说只要是Object类里面定义的非私有的属性和方法,任何类都可…...
家装材料清单中会有哪些装饰材料?
在家居装修中,业主可以根据装修公司出具的材料清单去一一采购,这样不至于有遗漏,就算采用全包的方式,通过材料清单也可以大致了解当时房子装修所用的材料,补充自己的装修知识。下面跟随小编一起了解下房子装修材料中所…...
【C++初阶】6. CC++内存管理
1. C/C内存分布 我们先来看下面的一段代码和相关问题 int globalVar 1; static int staticGlobalVar 1; void Test() {static int staticVar 1;int localVar 1;int num1[10] { 1, 2, 3, 4 };char char2[] "abcd";const char* pChar3 "abcd";int* …...
【数据结构】万字超详解顺序表(比细狗还细)
我这个人走得很慢,但是我从不后退。 ——亚伯拉罕林肯 目录 一.什么是线性表? 二.什么是顺序表? 三.接口函数的实现 1.创建工程 2.构造顺序表 3.初始化顺序表 3.初始化顺序表 4.顺序表的尾插 5.顺序…...
yolov5 剪枝、蒸馏、压缩、量化
文章大纲 剪枝推理优化YOLOv5 剪枝可能出现的问题参考文献与学习路径考察神经网络时期重要的激活函数sigmoid和tanh,它们有一个特点,即输入值较大或者较小的时候,其导数变得很小,而在训练阶段(详见1.2.3节),需要求取多个导数值,并将每层得到的导数值相乘,这样一旦层数…...
如何用python代码,更改照片尺寸,以及更换照片底色
前言 python浅浅替代ps?如何用代码来p证件照并且更换底色? 唉,有个小姐姐给我扔了张照片,叫我帮忙给她搞成证件照的尺寸还得换底色,她说自己忙的很 可惜电脑上没有ps只有pycharm,没得办法只能来试试看代…...
【pygame游戏】Python实现蔡徐坤大战篮球游戏【附源码】
前言 话说在前面,我不是小黑子~😏 本文章纯属技术交流~娱乐 前几天我获得了一个坤坤打篮球的游戏,也给大家分享一下吧~ 好吧,其实并不是这样的游戏,往下慢慢看吧。 准备工作 开发环境 Python版本:3.7.8 …...
php mysql做网站登录/营销软件网站
网上看到好多朋友都通过了软考,我也好想参加软考,听说这个证含金量挺高的,加油,打算下半年参加考试,现在赶紧的看书哦,下面是希赛的考试资料网站,有时间上来多学习了,也希望参加过和准备参加的朋…...
做网站等保收费/怎么申请建立网站
[aligncenter][sizex-large][b][colorred] 在myeclipse配置subclipse插件,使用SVN服务器[/color][/b][/size][/align][colorgreen]项目管理软件:Subversion(SVN服务器客户端)下载[/color]:[url]http://subversion.apache.org/[/url][colorgre…...
网站期刊怎么做/今天的新闻头条
组件内引入图片要使用绝对路径。/static/…主页面的生命周期用onLoad代替created,onReady代替mounted。组件内使用原来的created与mounted。用tap事件代替click事件。 阻止事件冒泡时要在外层加一层标签<view tap.stop“stop”>,直接在需要使用的方…...
网站建设 开办费/上海公司排名
本人应用PHP开发程序也小有年头了,对于PHP程序也有一些自己的简介,接触了一些国内外优秀的MVC框架,近日,突然想了解一下基本的MVC框架式如何实现的,所以开始着手研究自己动手打造出一个简单的MVC框架。对于研究的心得拿…...
绿色在线网站/服务营销的七个要素
...
南京seo公司哪家好/武汉seo工厂
多世界诠释有点类似科幻小说中最喜欢使用的“平行宇宙”概念。该诠释认为,波函数对电子位置的其他预测不但没有消失,而且还全部发生了,只不过它们都发生在彼此不相干的世界里而已。这听上去就像,如果你在这个现实里做了什么糟糕的…...