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关键字可以访问父类的成员。

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的特性。

继承的单根性:

一个类只能有一个父类。

四、父类和子类的相互转换

给cat和dog分别添加have的方法:

 class Cat : Animal{public Cat(string name, string color, string kind, string favorite): base(name, color, kind){this.Favorite = favorite;}//吃饭public void Have(){Console.WriteLine("我们要吃香喷喷的烤鱼啦!");}}
  class Dog : Animal{     public Dog(string name, string color, string kind, string favorite): base(name, color, kind){this.Favorite = favorite;}      //吃饭public void Have(){Console.WriteLine("我们要吃香喷喷的排骨啦!");}}

在这里插入图片描述

      static void Main(string[] args){//创建一只狗和一只猫Cat objCat = new Cat("球球儿", "黄色", "小花猫", "小鱼");Dog objDog = new Dog("棒棒", "黑色", "小黑狗", "排骨");//将子类对象添加的父类集合List<Animal> list = new List<Animal>();list.Add(objCat);list.Add(objDog);//取出子类对象foreach (Animal obj in list){if (obj is Cat)((Cat)obj).Have();else if (obj is Dog)((Dog)obj).Have();}Console.ReadLine();}

由于父类不能直接调用子类的方法,所以这种很麻烦,所以我们引出下面的抽象类和抽象方法。

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

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

相关文章

12 vue3之异步组件代码分包内置组件suspense和teleport

异步组件 在大型应用中&#xff0c;我们可能需要将应用分割成小一些的代码块 并且减少主包的体积&#xff08;不需要在首屏加载得都可使用异步组件&#xff09; 这时候就可以使用异步组件 顶层 await 在setup语法糖里面 使用方法 <script setup> 中可以使用顶层 awa…

IA4054 独立直线锂离子电池充电器,带热调节功能芯片IC

一般描述 LA4054 是一款适用于单体锂离子电池的完整恒流/恒压线性充电器。其ThinSOT封装和较低的外部元件数量使IA4054非常适合便携式应用。此外&#xff0c;LA4054专门设计用于在USB电源规格内工作。 由于内部MOSFET架构&#xff0c;不需要外部感测电阻器&…

Spring6梳理9—— 依赖注入之注入对象类型属性

9.1 依赖注入之外部注入对象类型属性 9.1.1 创建dept与emp类 1.dept类 package com.atguigu.spring6.iocxml.ditest;//部门类 public class Dept {private String dname;public String getDname() {return dname;}public void setDname(String dname) {this.dname dname;…

鸿蒙NEXT生态应用核心技术理念:统一生态,原生智能

统一生态 移动操作系统和桌面操作系统的跨平台应用开发框架不尽相同&#xff0c;从渲染方式的角度可以归纳为 WebView 渲染、原生渲染和自渲染这三类&#xff0c;鸿蒙系统对应的提供系统 WebView、ArkUI 框架和XComponent 能力来支撑三种类型的跨平台框架的接入主流跨平台开发…

Java项目实战II基于Java+Spring Boot+MySQL的保密信息学科平台系统(源码+数据库+文档)

目录 一、前言 二、技术介绍 三、系统实现 四、论文参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 随着高等教…

Ruffle 继续在开源软件中支持 Adobe Flash Player

大多数人已经无需考虑对早已寿终正寝的 Adobe Flash 的支持&#xff0c;但对于那些仍有一些 Adobe Flash/SWF 格式的旧资产&#xff0c;或想重温一些基于 Flash 的旧游戏/娱乐项目的人来说&#xff0c;开源 Ruffle 项目仍是 2024 年及以后处理 Flash 的主要竞争者之一。 Ruffl…

免费好用的ppt素材库有哪些?这2个在线网站值得推荐!

ppt素材去哪找&#xff1f; 对于很多做PPT的人来说&#xff0c;做PPT的过程中&#xff0c;不是在找素材&#xff0c;就是在去找ppt素材的路上&#xff0c;想寻找到与内容相匹配的ppt素材&#xff0c;往往占用了大量的时间&#xff0c;且ppt和ppt素材库本身是分离的&#xff0c…

Qt 学习第十天:小项目:QListWidget的使用

一、页面布局 二、命名按钮 双击按钮可以修改显示中的文字&#xff08;例如&#xff1a;改成“全选”&#xff09;&#xff0c;objectName是要改成程序员所熟悉的名字&#xff08;英文&#xff0c;符合代码规范&#xff09;方便修改和书写代码&#xff0c;一看就能看懂的 三、…

直接从U盘里删除文件能找回吗?不慌!教你4种恢复技巧

在数字化时代&#xff0c;U盘已成为我们日常生活和工作中不可或缺的数据存储工具。然而&#xff0c;随着使用频率的增加&#xff0c;误删文件的情况也时有发生。当文件从U盘中被直接删除时&#xff0c;许多人可能会感到绝望&#xff0c;认为这些文件已经永久丢失。 但实际上&am…

C#基础(14)冒泡排序

前言 其实到上一节结构体我们就已经将c#的基础知识点大概讲完&#xff0c;接下来我们会讲解一些关于算法相关的东西。 我们一样来问一下gpt吧&#xff1a; Q:解释算法 A: 算法是一组有序的逻辑步骤&#xff0c;用于解决特定问题或执行特定任务。它可以是一个计算过程、一个…

Python全网最全基础课程笔记(十一)——字符串所有操作,跟着思维导图和图文来学习,爆肝2w字,无数代码案例!

本专栏系列为Pythong基础系列&#xff0c;每篇内容非常全面&#xff0c;包含全网各个知识点&#xff0c;非常长&#xff0c;请耐心看完。 每天都会更新新的内容&#xff0c;搜罗全网资源以及自己在学习和工作过程中的一些总结&#xff0c;可以说是非常详细和全面。 以至于为什么…

麦克风是不是越贵越好?选购无线麦克风需注意的五个关键点

相信接触过短视频或者直播行业的朋友们都知道麦克风的重要性&#xff0c;这是拍摄中很常用的设备&#xff0c;而麦克风的好坏也决定了整体音质的效果如何。不过有些刚入门的朋友们对麦克风并不是很了解&#xff0c;认为麦克风是不是越贵就越好&#xff1f; 其实并不是&#xff…

电抗器可以减少发电机阻力吗

电抗器通常用于电力系统中主要为了限制短路电流、改善功率因数和抑制谐波等&#xff0c;而不是直接减少发电机的阻力。具体来说&#xff0c;电抗器在发电机系统中的作用主要包括以下几个方面&#xff1a; 1. 限制短路电流 电抗器&#xff08;特别是限流电抗器&#xff09;可以…

22:SPI一:简单的使用

SPI简单的使用 1、什么是SPI2、数据通信2.1&#xff1a;5个重要参数2.2&#xff1a;4种传输模式 3、程序模拟SPI通信时序3、片上外设SPI通信时序 1、什么是SPI SPI是一种同步的&#xff0c;全双工&#xff0c;支持总线挂载多设备的通信协议。它特别适用于高效&#xff0c;快速…

激光粉尘传感器:筑牢粮仓安全防线,有效应对粮食粉尘爆炸高危风险

随着我国农业的持续发展和粮食产量的稳步提升&#xff0c;2023年全国粮食总产量达到了13908.2亿斤&#xff0c;这一丰硕成果不仅保障了国家的粮食安全&#xff0c;也对粮食的储备、加工、运输等环节提出了更高的要求。然而&#xff0c;在粮食产业链的各个环节中&#xff0c;粮食…

11_Python函数基本概念和示例

函数 函数是组织代码、提高代码复用性的基本工具。一个函数是组织好的、可重复使用的、用来实现单一或相关联功能的代码段。函数类型&#xff1a;内置函数、自定义函数 定义函数 在 Python 中&#xff0c;使用 def 关键字来定义一个函数。 函数可以有参数&#xff0c;也可以…

虚拟背景扣像SDK解决方案,电影级抠像技术

美摄科技&#xff0c;作为影像技术领域的领航者&#xff0c;凭借其革命性的虚拟背景抠像SDK解决方案&#xff0c;正以前所未有的方式&#xff0c;重新定义电影级背景抠像技术&#xff0c;让直播与视频制作迈入全新境界。 电影级抠像技术&#xff0c;重塑视觉盛宴 美摄科技的虚…

Appium环境搭建及元素定位

Appium是一个开源测试自动化框架&#xff0c;可用于原生&#xff0c;混合和移动Web应用程序测试。它使用WebDriver 协议驱动iOS&#xff0c;Android和Windows应用程序。 01 环境搭建步骤 Appium环境安装&#xff1a; 第一步安装 appium 桌面版客户端 Appium-1.12.1.dmg(MAC…

比亚迪高歌猛进背后,高端市场攻坚与出海风险并存

比亚迪高速扩张的繁荣表象之下&#xff0c;仍遭遇高端市场挑战&#xff0c;全球化征程面临可持续性考验。 转载&#xff1a;科技新知 原创 作者丨颜曌 编辑丨蕨影 比亚迪的发展史&#xff0c;堪称我国新能源汽车品牌的缩影。如今在全球新能源市场越来越有影响力的比亚迪&…

自动化测试需要学什么【附学习路线和学习教程】

随着自动化测试行业的薪酬越来越高&#xff0c;平均月薪早在很多年前就已破万&#xff0c;也有越来越多的人愿意投身测试行业&#xff0c;成为一名测试工程师&#xff0c;这些人当中也有相当多的一部分是测试行业的小白&#xff0c;并不知道自动化测试需要学习哪些内容 在放上…