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

news2024/9/27 19:19:09

文章目录

  • 一、继承的基本使用
    • 继承的概念:
    • 继承的特点:
    • 为什么使用继承?
  • 二、继承的关键字
    • 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.coloradmin.cn/o/2165374.html

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

相关文章

C/C++逆向:循环语句逆向分析

在逆向分析中,循环语句通常会以特定的汇编模式或结构体现出来。常见的循环语句包括 for 循环、while 循环和 do-while 循环。由于不同的编译器会根据代码优化的级别生成不同的汇编代码,分析循环的模式也可能会有所不同。以下是三种常见循环语句的汇编分析…

【源码+文档+调试讲解】人事管理系统设计与实现Python

摘 要 人事管理系统的目的是让使用者可以更方便的将人、设备和场景更立体的连接在一起。能让用户以更科幻的方式使用产品,体验高科技时代带给人们的方便,同时也能让用户体会到与以往常规产品不同的体验风格。 与安卓,iOS相比较起来&#xff…

【数据结构】剖析二叉树(Binary Tree)

目录 💯引言 💯二叉树的定义与基本概念 (一)定义 (二)节点结构 (三)二叉树的形态 💯二叉树的遍历 (一)前序遍历(Preorder Trav…

机器人控制器设计与编程基础实验高效版本-ESP32等单片机实验报告

只需要课程大纲或进度表wokwi 大模型工具&#xff0c;就可以完全掌握嵌入式系统基础实验的所有核心点。 LCD // Learn about the ESP32 WiFi simulation in // https://docs.wokwi.com/guides/esp32-wifi https://wokwi.com/projects/321525495180034642#include <WiFi.h>…

【AI学习】Lilian Weng:What are Diffusion Models?

读OpenAI 的 Lilian Weng博客《What are Diffusion Models?》 文章链接:https://lilianweng.github.io/posts/2021-07-11-diffusion-models/ 通过浏览器的在线翻译&#xff0c;直接截图了。翻译的有些问题&#xff0c;但是基本能大概看明白了。 我只是个人的记录&#xff0c;…

开发经验总结: 读写分离简单实现

背景 使用mysql的代理中间件&#xff0c;某些接口如果主从同步延迟大&#xff0c;容易出现逻辑问题。所以程序中没有直接使用这个中间件。 依赖程序逻辑&#xff0c;如果有一些接口可以走读库&#xff0c;需要一个可以显示指定读库的方式来连接读库&#xff0c;降低主库的压力…

降准降息一揽子措施点燃 A 股激情,4% 大涨之后趋势深度剖析

文章目录 牛回速归原因分析引爆点情绪和信心一根大阳线&#xff0c;千军万马来相见阴霾是否一扫而空还未可知 流动性和增量 潜在隐患等待经济复苏配套政策期待中美关系进展 短期内趋势分析空军短期内仍有余力如何看待第2日的回撤外围 趋势分析结论短期内可能仍有波折中长期会是…

【数学分析笔记】第3章第4节闭区间上的连续函数(1)

3. 函数极限与连续函数 3.4 闭区间上的连续函数 3.4.1 有界性定理 【定理3.4.1】 f ( x ) f(x) f(x)在闭区间 [ a , b ] [a,b] [a,b]上连续&#xff0c;则 f ( x ) f(x) f(x)在闭区间 [ a , b ] [a,b] [a,b]上有界。 【证】用反证法&#xff0c;假设 f ( x ) f(x) f(x)在 [ …

2-103 基于matlab的光电信号下血氧饱和度计算

基于matlab的光电信号下血氧饱和度计算&#xff0c;光转换成电信号时&#xff0c;由于动脉对光的吸收有变化而其他组织对光的吸收基本不变&#xff0c;得到的信号就可以分为直流DC信号和交流AC信号。提取AC信号&#xff0c;就能反应出血液流动的特点。这种技术叫做光电容积脉搏…

【Linux学习】2-1 Linux系统下运行C语言输出hello word

1.双击打开VMware软件&#xff0c;点击开启此虚拟机后&#xff0c;等待点击头像输入密码进入 2.“CtrlAltt”调出命令行终端&#xff0c;输入命令sudo apt-get install vim安装vim&#xff0c;输入命令sudo apt-get install gcc安装gcc 3.输入命令vi hello.c进入C语言编写环境&…

Linux —— Socket编程(一)

一、本篇重点 1. 认识IP地址、端口号、网络字节序等网络编程中的基本概念 2. 学习Socket api的基本用法 3. 能够实现一个简单的udp客户端/服务器 二、基本概念 1. 理解源IP地址和目的IP地址 简单的理解&#xff0c;IP地址是用于标识一台机器的&#xff0c;我们通过IP地址去…

使用 UWA Gears 测试小游戏性能

UWA Gears 是UWA最新发布的无SDK性能分析工具。针对移动平台&#xff0c;提供了实时监测和截帧分析功能&#xff0c;帮助您精准定位性能热点&#xff0c;提升应用的整体表现。 随着小游戏的规模和用户量持续增长&#xff0c;玩家对于小游戏的性能要求也越来越高。为了能够给玩…

力扣234 回文链表 Java版本

文章目录 题目描述代码 题目描述 给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为 回文链表 。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,2,1] 输出&#xff1a;true 示例 2&…

【ASE】第三课_山丘颜色梯度效果

今天我们一起来学习ASE插件&#xff0c;希望各位点个关注&#xff0c;一起跟随我的步伐 今天我们来学习山丘的颜色梯度显示&#xff0c;根据不同的高度显示不同的颜色 最终效果&#xff1a; 思路&#xff1a; 1.先加载模型的纹理贴图和法线贴图 2. 获得模型世界顶点Y向量&am…

【渗透测试】-灵当CRM系统-sql注入漏洞复现

文章目录 概要   灵当CRM系统sql注入漏洞&#xff1a;   具体实例&#xff1a;  技术名词解释  小结 概要 近期灵当CRM系统爆出sql注入漏洞&#xff0c;我们来进行nday复现。 灵当CRM系统sql注入漏洞&#xff1a; Python sqlmap.py -u "http://0.0.0.0:0000/c…

当okhttp网络库遇到不规范的http状态码

如题&#xff0c;最近工作遇到的问题&#xff0c;我们的 Android 应用网络请求埋点报表&#xff0c;收集到了奇怪的网络请求异常&#xff1b;通过日志收集与分析&#xff0c;确定到是服务器返回了不规范的状态码所导致。 如上是根据线上的业务场景&#xff0c;本地写个简单的M…

二进制位运算题

本期介绍&#x1f356; 主要介绍&#xff1a;1. 在不创建临时变量的情况下交换两个变量&#xff0c;2. 计算变量在内存中存放2进制位“1”的个数&#xff0c;3. 求两个数的二进制中不同位的个数&#xff0c;4. 分别打印整数的二进制中奇数位和偶数位&#xff0c;5. 判断一个整数…

SentencePiece进行文本分类

SentencePieces 前言 Step1:故事 SentencePiece 是一个无监督的文本分词器和 detokenizer(还原回去的&#xff1f;)主要用于词汇表大小是预定的文本生成系统中它拓展了原始句子的训练&#xff0c;实现子词单元如 BPE 和 unigram language model技术亮点 纯数据驱动&#xff…

Qemu开发ARM篇-6、emmc/SD卡AB分区镜像制作

文章目录 1、AB分区镜像制作2、uboot修改3、镜像启动 在上一篇 Qemu开发ARM篇-5、buildroot制作根文件系统并挂载启动中&#xff0c;我们通过buildroot制作了根文件系统&#xff0c;并通过 SD卡的形式将其挂载到设备并成功进行了启动&#xff0c;但上一章中&#xff0c;我们的…

车载应用的多功能需求与公安、金融等行业的应用特点

随着科技的快速发展&#xff0c;车载应用的功能需求也日益多样化。除了基本的视频监控功能外&#xff0c;现代车载应用还需满足一系列高级功能&#xff0c;如无线网络视频监控、GPS卫星定位、车辆调度、语音报站、行驶信息记录以及多媒体娱乐广告播放等。这些功能在公安、金融等…