C#和数据库高级:继承与多态

文章目录

  • 一、继承的基本使用
    • 继承的概念:
    • 继承的特点:
    • 为什么使用继承?
  • 二、继承的关键字
    • 1、this关键字
    • 2、base关键字
    • 3、Protected关键字
    • 4、子类调用父类的构造函数的总结:
  • 三、继承的特性
    • 继承的传递性:
    • 继承的单根性:
  • 四、深入理解多态
  • 五、多态的实现和应用
    • 使用继承实现多态
    • 继承多态在方法调用方面的应用
  • 六、里氏替换原则

面向对象编程(OOP)有三个主要特性:

  1. 封装(Encapsulation)
    封装是将数据(属性)和操作数据的方法(函数)绑定在一起,并隐藏内部实现细节的特性。通过封装,可以将对象的内部状态保护起来,只允许通过对象提供的公共接口进行操作,从而提高代码的安全性和可维护性。

  2. 继承(Inheritance)
    继承允许一个类(子类)继承另一个类(父类)的属性和方法,从而实现代码的重用。子类可以扩展或修改父类的行为,形成一个层次结构。通过继承,可以简化代码并增加系统的可扩展性。

  3. 多态(Polymorphism)
    多态指的是不同的对象对相同的消息(方法调用)做出不同的响应。它允许一个接口以多种形式出现。例如,同一个方法名称在不同的对象中可以有不同的实现。多态提高了系统的灵活性和扩展性。

这三个特性是面向对象编程的核心,帮助开发者设计更为模块化、易维护和可扩展的软件系统。

一、继承的基本使用

继承的概念:

允许一个类(子类)继承另一个类(父类)的属性和方法,从而实现代码的重用。

继承的特点:

继承的顺序不可逆,继承的下级拥有上一级的属性和方法。

为什么使用继承?

解答:最主要的方法是实现代码的复用,举例:有一个猫类和狗类,但是两者都有大量的属性和方法是重复的,所以这个时候可以建一个动物类,让猫类和狗类继承动物类,减少代码的使用。

应继承的步骤和使用要点:

  • 1、抽象的公共部分放到一个特定的类中(父类)
  • 2、其他子类继承父类,就能拥有父类的属性和方法。
  • 3、根据子类的需要,写单独的特征和方法。

具体实现方法:

在子类的后面使用冒号:父类

 class Dog : Animal{//赛跑public void Race(){Console.WriteLine("下面我给大家表演《狗狗精彩百米跨栏》,请大家鼓掌啊:>");}}

二、继承的关键字

1、this关键字

this关键字可以访问父类的成员。this: 用于访问当前类的成员。你可以用 this 来引用当前对象的字段、属性和方法。它主要用于明确指示你是在引用当前对象的成员,有助于解决命名冲突(例如,构造函数的参数名与字段名相同的情况)

public class Parent
{public int Value;public void PrintValue(){Console.WriteLine(this.Value);}
}

base: 用于访问基类(父类)的成员。它允许你在派生类中访问基类中的字段、属性和方法,特别是在重写方法时。base 主要用于访问或调用基类中被隐藏或重写的成员。

public class Parent
{public int Value;public void PrintValue(){Console.WriteLine(Value);}
}public class Child : Parent
{public new int Value; // 在子类中隐藏父类的 Value 字段public void PrintParentValue(){Console.WriteLine(base.Value); // 访问父类中的 Value 字段}
}

2、base关键字

调用父类的构造函数、调用父类的属性和方法。base关键字可以在方法,构造函数和属性的访问器中使用,但是不可以在结构、成员声名中使用。

错误的使用:

 class Dog : Animal{     public Dog(string name, string color, string kind, string favorite): base(name, color, kind)//调用父类的构造方法{this.Favorite = favorite;}      base.Introduce();//在成员声名中使用是无效的}

正确的使用:

父类:

    class Animal{//无参数构造函数public Animal() { }//3个参数的构造方法public Animal(string name, string color, string kind){this.Color = color;this.Name = name;this.Kind = kind;}public string Name { get; set; }//名字public string Color { get; set; }//颜色public string Kind { get; set; }//种类public string Favorite { get; set; }//喜好//自我介绍public void Introduce(){string info = string.Format("我是漂亮的{0},我的名字叫{1},身穿{2}的衣服,我爱吃{3}!", Kind, Name, Color, Favorite);Console.WriteLine(info);}}

子类:

    class Dog : Animal{     public Dog(string name, string color, string kind, string favorite): base(name, color, kind)//调用父类的构造函数{this.Favorite = favorite;}      //赛跑public void Race(){base.Introduce();//调用父类的方法Console.WriteLine("下面我给大家表演《狗狗精彩百米跨栏》,请大家鼓掌啊:>");}       }

如上使用this也可以,但是最好要用base,更好阅读性,base先调用父类的构造函数,然后再调用子类的构造函数,因为创建子类实例的时候会先创建子类所继承的父类。

3、Protected关键字

如果父类中的某个成员函数只允许其子类访问,那么使用Protected关键字

在这里插入图片描述

// 定义子类 Dog 继承自 Animal
public class Dog : Animal
{// 子类构造函数public Dog(string name) : base(name){}// 子类的方法,用于调用父类的 protected 方法public void DogSpeak(){// 可以直接访问父类的 protected 成员Speak();}
}

4、子类调用父类的构造函数的总结:

问题:如果去掉父类的构造函数,并且子类不使用base那么会如何?

隐式调用:如果其他子类的构造函数没有使用base指明调用的父类的那个构造函数时,子类会默认调用父类的无参数构造函数。

显示调用:如果父类没有无参数的构造函数,子类的构造函数必须指明调用父类的那个构造函数。

总之父类要么写一个无参数的默认的构造函数,要么子类指定,不然会报错。

三、继承的特性

继承的传递性:

A是B的父类,B是C的父类,那么C具有A的特性。

继承的单根性:

一个类只能有一个父类。

四、深入理解多态

多态的概念:不同的对象,接收相同的消息,产生不同的行为,称为多态。
多态是由虚拟机自行决定的。
在这里插入图片描述

五、多态的实现和应用

使用继承实现多态

  • 父类中必须有抽象方法或虚方法(虚方法后面讲述)。
  • 子类必须重写父类中的抽象方法或虚方法。
  • 子类对象必须转换成父类类型去使用。

继承多态在方法调用方面的应用

粗浅的理解:父类类型作为方法参数,子类调用传递过来子类对象,子类被转换成父类类型,提高了代码的维护性和合作性。
在这里插入图片描述

六、里氏替换原则

在这里插入图片描述

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

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

相关文章

【服务器入门】Linux系统基础知识

【服务器入门】Linux系统基础知识 远程登录与文件传输基础命令与文本编辑vi/vim使用shell脚本基本命令1、目录操作2、文件创建与删改3、文件连接与查看 参考 目前超算使用的系统以Linux系统为主,肯定需要了解一些相关知识。本博客就以本人运行WRF模型所需&#xff0…

Remix在SPA模式下,出现ErrorBoundary错误页加载Ant Design组件报错,不能加载样式的问题

Remix是一个既能做服务端渲染,又能做单页应用的框架,如果想做单页应用,又想学服务端渲染,使用Remix可以降低学习成本。最近,在学习Remix的过程中,遇到了在SPA模式下与Ant Design整合的问题。 我用Remix官网…

Godot游戏如何提升触感体验

在游戏世界中,触感体验至关重要,既能极大提升玩家沉浸感,让其深度融入游戏,在操作角色或与环境互动时,通过触感反馈获得身临其境的真实感(比如动作游戏中角色攻击或受击时的振动反馈,能使玩家更…

花朵识别系统Python+卷积神经网络算法+人工智能+深度学习+计算机课设项目+TensorFlow+模型训练

一、介绍 花朵识别系统。本系统采用Python作为主要编程语言,基于TensorFlow搭建ResNet50卷积神经网络算法模型,并基于前期收集到的5种常见的花朵数据集(向日葵、玫瑰、蒲公英、郁金香、菊花)进行处理后进行模型训练,最…

解决DockerDesktop启动redis后采用PowerShell终端操作

如图: 在启动redis容器后,会计入以下界面 : 在进入执行界面后如图: 是否会觉得界面过于单调,于是想到使用PowerShell来操作。 步骤如下: 这样就能使用PowerShell愉快地敲命令了(颜值是第一生…

【stm32笔记】使用rtt-studio与stm32CubeMx联合创建项目

使用rtt-studio与stm32CubeMx联合创建项目 创建rt-thread项目 设置项目信息 在项目资源管理器中“右击“,创建RRT studio 项目 双击“RT-Thread 项目“。 选择MCU,设置UART,以及调试方式。添加项目名称,点击“完成“按钮。 …

Redis的主从模式、哨兵模式、集群模式

最近学习了一下这三种架构模式,这里记录一下,仅供参考 目录 一、主从架构 1、搭建方式 2、同步原理 3、优化策略: 4、总结: 二、哨兵架构 1、搭建哨兵集群 2、RedisTemplate如何使用哨兵模式 三、分片集群架构 1&#…

集成学习详细介绍

以下内容整理于: 斯图尔特.罗素, 人工智能.现代方法 第四版(张博雅等译)机器学习_温州大学_中国大学MOOC(慕课)XGBoost原理介绍------个人理解版_xgboost原理介绍 个人理解-CSDN博客 集成学习(ensemble):选择一个由一系列假设h1, h2, …, hn构成的集合…

AI运动小程序开发常见问题集锦一

截止到现在写博文时,我们的AI运动识别小程序插件已经迭代了23个版本,成功应用于健身、体育、体测、AR互动等场景;为了让正在集成或者计划进行功能扩展优化的用户,少走弯路、投入更少的开发资源,我们归集了一部分集中的…

Redis数据结构之set

一.set集合特性 集合类型也是保存多个字符串类型的元素的,但和list列表不一样,集合中的元素是无序的,而且元素不能够重复,不仅支持增删查改,还支持交集并集等操作 二.相关命令 1.sadd sadd key members…… 咱们把…

【机器学习】--- 决策树与随机森林

文章目录 决策树与随机森林的改进:全面解析与深度优化目录1. 决策树的基本原理2. 决策树的缺陷及改进方法2.1 剪枝技术2.2 树的深度控制2.3 特征选择的优化 3. 随机森林的基本原理4. 随机森林的缺陷及改进方法4.1 特征重要性改进4.2 树的集成方法优化4.3 随机森林的…

JavaScript ---案例(统计字符出现次数)

统计字符出现次数 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-w…

深度学习之微积分预备知识点(2)

极限&#xff08;Limit&#xff09; 定义&#xff1a;表示某一点处函数趋近于某一特定值的过程&#xff0c;一般记为 极限是一种变化状态的描述&#xff0c;核心思想是无限靠近而永远不能到达 公式&#xff1a; 表示 x 趋向 a 时 f(x) 的极限。 知识点口诀解释极限的存在左…

LabVIEW软件维护的内容是什么呢?

LabVIEW软件维护涉及多个方面&#xff0c;确保程序的正常运行和长期稳定性。维护内容包括以下几个方面&#xff1a; 1. Bug修复 在开发和运行过程中&#xff0c;可能会出现各种软件问题或缺陷&#xff08;bugs&#xff09;。维护工作之一就是识别这些问题并通过修复程序中的代…

uniapp child.onFieldChange is not a function

uni-forms // 所有子组件参与校验,使用 for 可以使用 awiatfor (let i in childrens) {const child childrens[i];let name realName(child.name);if (typeof child.onFieldChange function) {const result await child.onFieldChange(tempFormData[name]);if (result) {…

【网络】TCP/IP 五层网络模型:网络层

最核心的就是 IP 协议&#xff0c;是一个相当复杂的协议 TCP 详细展开讲解&#xff0c;是因为 TCP 确实在开发中非常关键&#xff0c;经常用到&#xff0c;IP 则不同&#xff0c;和普通程序猿联系比较浅。和专门开发网络的程序猿联系比较紧密&#xff08;开发路由器&#xff0…

Qt5详细安装教程(包含导入pycharm)

1.自行下载Qt 2.双击进行安装 3.设置完成后勾选接受&#xff0c;跳转下一步 4.可选择安装位置&#xff0c;比较习惯安装在D盘 5.根据需求勾选对应组件安装 6.安装完成后&#xff0c;打开pycharm&#xff0c;进入settings—>选择ExternalTools&#xff0c;根据以下步骤进行配…

【WEB】EZ_Host

1、 2、解答 http://8762a9b0-5aa3-49f8-b8d2-54e4cb0746cc.www.polarctf.com:8090/?hostlocalhost;lshttp://8762a9b0-5aa3-49f8-b8d2-54e4cb0746cc.www.polarctf.com:8090/?hostlocalhost;cat flag即可看到答案

数据中台系统产品原型RP原型Axure高保真交互原型 源文件分享

在数字化时代&#xff0c;数据已经成为企业最宝贵的资产之一。为了更好地管理和利用这些数据&#xff0c;这边为大家整理了一套数据中台Axure高保真原型。这套原型致力于为企业提供全方位的数据服务&#xff0c;助力企业实现数据驱动的创新发展。 下载及预览地址&#xff1a;h…

828华为云征文|Flexus云服务器X实例部署宝塔运维面板

本次华为云Flexus云服务器X实例部署宝塔运维面板教学&#xff0c;这次是推陈出新啊 之前的云耀云服务器L实例已经很不错了&#xff0c;大力赞叹华为云的 同时感谢华为云提供优惠卷&#xff0c;只能说白嫖真是太棒了 华为云近期正在筹办华为云828企业节活动&#xff0c;90款免…