C#核心之面向对象-继承

面向对象-继承

在这里插入图片描述

文章目录

      • 1、继承的基本规则
        • 1、基本概念
        • 2、基本语法
        • 3、示例
        • 4、访问修饰符的影响
        • 5、子类和父类的同名成员
      • 2、里氏替换原则
        • 1、基本概念
        • 2、is和as
        • 3、基本实现
      • 3、继承中的构造函数
        • 1、基本概念
        • 2、父类的无参构造函数
        • 3、通过base调用指定父类构造
      • 4、万物之父和装箱拆箱
        • 1、万物之父
        • 2、万物之父使用
        • 3、装箱拆箱
      • 5、密封类
        • 思考 载具类上下车

1、继承的基本规则

1、基本概念
一个类A继承一个类B类A将会继承类B的所有成员A类将拥有B类的所有特征和行为
被继承的类称为父类、基类、超类
继承的类称为子类。派生类子类可以有自己的特征和行为
特点1、单根性 子类只能有一个父类2、传递性 子类可以间接继承父类的父类
2、基本语法
class 类名 : 被继承的类名{}
3、示例
TeachingTeacher tt = new TeachingTeacher();
tt.name = "亮亮老师";
tt.number = 1;
tt.SpeakName();
tt.subject = "Unity";
tt.SpeakSubject();class Teacher
{public string name;public int number;public void SpeakName(){Console.WriteLine(name);}
}class TeachingTeacher : Teacher
{public string subject;public void SpeakSubject(){Console.WriteLine(subject + "老师");}
}
4、访问修饰符的影响
public 公共 内外部访问
private 私有 内部访问 //子类可以通过父类方法间接访问私有成员
protected 保护 内部和子类访问
internal 内部 只有在同一个程序集的文件中,内部类或者成员才可以访问
5、子类和父类的同名成员

概念:C#中允许子类存在和父类同名的成员,但不建议这样做

2、里氏替换原则

1、基本概念
里氏替换原则是面向对象七大原则中最重要的原则
概念:任何父类出现的地方,子类都可以替代
重点:语法表现-父类容器装子类对象,因为子类对象包含了父类的所以内容
作用:方便进行对象存储和管理
2、is和as
基本概念is:判断一个对象是否是指定类对象返回值:bool 是为真,不是为假as:将一个对象转换为指定类对象返回值:指定类对象成功返回指定类型对象,失败返回null
基本语法:类对象 is 类名该语句块会有一个bool返回值 true 和 false类对象 as 类名该语句块会有一个对象返回值 对象和null
3、基本实现
//里氏替换原则 用父类容器装载子类对象
GameObject player = new Player();
GameObject monster = new Monster();
GameObject boss = new Boss();GameObject[] objects = { player, monster, boss };if(player is Player)
{//Player p = player as Player;//p.PlayerAtk();(player as Player).PlayerAtk();
}for(int i = 0; i < objects.Length; i++)
{if (objects[i] is Player){(objects[i] as Player).PlayerAtk();}else if (objects[i] is Monster){(objects[i] as Monster).MonsterAtk();}else if (objects[i] is Boss){(objects[i] as Boss).BossAtk();}
}
class GameObject
{}
class Player : GameObject
{public void PlayerAtk(){Console.WriteLine("玩家攻击");}
}
class Monster : GameObject
{public void MonsterAtk(){Console.WriteLine("怪兽攻击");}
}
class Boss : GameObject
{public void BossAtk(){Console.WriteLine("Boss攻击");}
}

3、继承中的构造函数

1、基本概念
特点当声明一个子类对象时先执行父类的构造函数   //执行顺序再执行子类的构造函数
注意父类的无参构造很重要子类可以通过base关键字代表父类,调用父类构造
2、父类的无参构造函数

子类实例化时,默认自动调用父类的无参构造

3、通过base调用指定父类构造
class Father{public Father(int i){}}
class Son : Father{public Son(int i) : base(i){}public Son(int i, sting str):this(i){}
}

4、万物之父和装箱拆箱

1、万物之父
关键字	object
概念object是所有类型的基类,它是一个类(引用类型)
作用1、可以利用里氏替换原则,用object容器装所有对象2、可以用来表示不确定类型,作为函数参数类型
2、万物之父使用
引用类型用is as 来判断和转换class son{Speak(){}}object o = new Son();if(o is son){(o as son).Speak();}
值类型用强转object o = 1.1f;float f = (float)o;
stringobject str = "123abc";string str1 = str.ToString;string str2 = str as string;
数组object arr = new int[10];int[] arr1 =(int[])arr;int[] arr1 =arr as int[];
3、装箱拆箱
发生条件用object存值类型(装箱)再把object转为值类型(拆箱)
装箱把值类型用引用类型存储栈内存会迁移到堆内存中
拆箱把引用类型存储的值类型取出来堆内存会迁移到栈内存中
好处:不确定类型时可以方便参数的存储和传递
坏处:存在内存迁移,增加性能消耗

5、密封类

1、基本概念

密封类是使用sealed密封关键字修饰的类
作用:让类无法再被继承

2、示例

sealed class Father{}
class Son : Father{}

3、作用

再面向对象程序设计中,密封类的主要作用就是不允许最底层子类被继承
可以保证程序的规范性、安全性
思考 载具类上下车
//定义一个载具类
//有速度,最大速度,可乘人数,司机和乘客,有上车,下车方法
//用载具类声明一个对象,并将若干人装载上车Car car = new Car(10, 20, 20);
Driver driver = new Driver();
car.GetIn(driver);
Passenger passenger1 = new Passenger();
car.GetIn(passenger1);
Passenger passenger2 = new Passenger();
car.GetIn(passenger2);
Passenger passenger3 = new Passenger();
car.GetIn(passenger3);
car.GetOff(passenger2);
class Person { }
class Driver : Person { }
class Passenger : Person { }
class Car
{public int speed;public int maxSpeed;public int num;public Person[] persons;public Car(int speed, int maxSpeed, int num){this.speed = speed;this.maxSpeed = maxSpeed;this.num = 0;  //实际人数persons = new Person[num];}public void GetIn(Person p){if (num >= persons.Length){Console.WriteLine("满载");return;}persons[num] = p;num++;}public void GetOff(Person p){for (int i = 0; i < persons.Length; i++){if (persons[i] == null){break;}if (persons[i] == p){//移动位置for (int j = i; j < num - 1; j++){persons[j] = persons[j + 1];}//最后一个位置清空persons[num - 1] = null;num--;break;}}}
}

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

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

相关文章

关于ESP32下载的几个小问题

文章目录 一、没有收到串口数据二、vscode使用jtag烧录失败 在使用esp32的时候&#xff0c;下载遇到了这么几个小问题&#xff0c;写一下解决方法。 一、没有收到串口数据 报错如下&#xff1a; 这是在使用arduino下载的时候出现的错误&#xff1a;A fatal error occurred: …

c++多线程2小时速成

简介 c多线程基础需要掌握这三个标准库的使用&#xff1a;std::thread,std::mutex, andstd::async。 1. Hello, world #include <iostream> #include <thread>void hello() { std::cout << "Hello Concurrent World!\n"; }int main() {std::th…

Web Component fancy-components

css-doodle 组件库 fancy-components 组件库使用 yarn add fancy-components使用&#xff1a; import { FcBubbles } from fancy-components new FcBubbles() //要用哪个就new哪个 new 这里可能会报错eslink,eslintrc.js中处理报错 module.exports {rules: {no-new: off} …

日志审计系统在提高网络安全方面具有哪些重要的作用

随着信息技术的飞速发展&#xff0c;我们正处于一个高度互联、数据驱动的网络时代。在这个时代&#xff0c;日志审计系统作为网络安全和信息管理的重要工具&#xff0c;发挥着至关重要的作用。下面德迅云安全就详细介绍下关于日志审计系统在当今网络时代的重要性。 一、什么是日…

四、Redis五种常用数据类型-List

List是Redis中的列表&#xff0c;按照插入顺序保存数据&#xff0c;插入顺序是什么样的&#xff0c;数据就怎么保存。可以添加一个元素到列表的头部(左边)或者尾部(右边)。一个列表最多可以包含232-1个元素(4294967295&#xff0c;每个列表超过40亿个元素)。是一种双向列表结构…

Redis单机安装

1.编译 cd redis安装目录 makemake install2.修改配置文件redis.conf #端口修改 port 6379 #后台进程启动 yes daemonize yes # daemonize no #注释掉 为了可以远程连接 #bind 127.0.0.1 #设置密码 requirepass pwd3.启动 ./redis-server ../redis.conf查看进程 [rootlocal…

使用Maven对Java独立应用程序进行编译打包

一、 安装Maven 1.解压&#xff0c;移动安装包 sudo tar -zxf ~/apache-maven-3.9.6-bin.tar.gz -C /usr/local/ cd /usr/local/ sudo mv apache-maven-3.9.6/ ./maven-3.9.6 sudo chown -R qiangzi ./maven-3.9.6 二、Java应用程序代码 1.版本信息&#xff1a; Spark-2.1…

设计软件有哪些?渲染软件篇(1),渲染100邀请码1a12

做设计要用到很多软件&#xff0c;今天我给大家介绍一些渲染方面的&#xff0c;仅供参考。 1、渲染100(http://www.xuanran100.com/?ycode1a12) 渲染100是网渲平台&#xff0c;为设计师提供高性能的渲染服务。通过它设计师可以把本地渲染移到云端进行&#xff0c;速度快价格便…

APP广告变现:自刷的秘密与规则

在移动互联网时代&#xff0c;广告已成为众多APP盈利的主要方式之一。对于开发者和运营者而言&#xff0c;如何通过广告变现提高收益是他们必须关注的问题。然而&#xff0c;在众多的变现方法中&#xff0c;“自刷广告”这一概念可能让一些人感到迷惑。实际上&#xff0c;只要在…

巨资回流,量子投资热潮再起

一股新的信心和资金浪潮正在席卷量子计算产业。 2023年4月30日&#xff0c;澳大利亚联邦政府和昆士兰州政府宣布共同出资9.4亿澳元&#xff08;约合6.2亿美元&#xff09;&#xff0c;支持美国初创企业PsiQuantum在布里斯班附近建设一台大型量子计算机。这项投资是最新的迹象之…

字符串的赋值

因为字符串本质上就是数组&#xff0c;因此它的赋值也具有数组的特点&#xff1a;只能在初始化时用等号。 1&#xff0e;字符串的初始化 方法一&#xff1a;指定大小 char s[6]"Hello"; //指定字符串最大占用6个的char型内存单元 虽然看上去是将整个字符串赋给了…

RT-IoT2022 数据集-扩展数据(自制方法)

数据集官网Discover datasets around the world!https://archive.ics.uci.edu/dataset/942/rt-iot2022RT-IoT2022 是源自实时物联网基础设施的专有数据集&#xff0c;作为集成了各种物联网设备和复杂网络攻击方法的综合资源而引入。该数据集包含正常和对抗性网络行为&#xff0…

基于ConvNeXt网络的图像识别

1、前言 ConvNeXt 网络基于传统的卷积神经网络&#xff0c;与当下 transformer当道而言简直是一股清流 ConvNeXt并没有特别复杂或者创新的结构 ConvNeXt 网络有五种大小&#xff0c;可以参考下面 2、项目实现 完整的项目如下&#xff1a; 这里参考了网上的ConvNeXt 模型&…

Springboot+Vue项目-基于Java+MySQL的个人云盘管理系统(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…

神经网络的基础:从感知机到复杂网络的进化

文章目录 一、神经网络的例子二、理解神经信号的传递2.1 感知机的结构和功能2.2 优化函数2.3 明确表示偏置 三、理解感知机和激活函数的作用3.1 基础感知机模型3.2 激活函数的引入 一、神经网络的例子 理解感知机 在探索神经网络之前&#xff0c;我们首先回顾了感知机的基本概…

iOS抓包工具——Stream

[清风穆云 ](https://cloud.tencent.com/developer/user/4224041) iOS抓包工具——Stream 关注作者 前往小程序&#xff0c;Get_更优_阅读体验&#xff01; 立即前往 腾讯云 开发者社区 文档建议反馈控制台 首页 学习 活动 专区 工具 TVP [最新优惠活动 ](http…

可视化实验三 Matplotlib库绘图及时变数据可视化

1.1 任务一 1.1.1 恢复默认配置 #绘图风格&#xff0c;恢复默认配置 plt.rcParams.update(plt.rcParamsDefault)#恢复默认配置 或者 plt.rcdefaults() 1.1.2 汉字和负号的设置 import matplotlib.pyplot as plt plt.rcParams["font.sans-serif"]"SimH…

Vue3 路由入门

先安装路由 npm i vue-router //创建路由器 import { createRouter, createWebHashHistory } from vue-router//1.导入组件 import Home from /components/Home.vue import News from /components/News.vue//2.配置路由映射规则 const routes [{name: home,path: /home,compo…

学习方法的重要性

原贴&#xff1a;https://www.cnblogs.com/feily/p/13999204.html 原贴&#xff1a;https://36kr.com/p/1236733055209095 1、 “一万小时定律”的正确和误区 正确&#xff1a; 天才和大师的非凡&#xff0c;不是真的天资超人一等&#xff0c;而是付出了持续不断的努力&…

Java数组创建与使用

一.创建和初始化 1.数组是怎么创建的&#xff1f; 直接举例子&#xff1a; int[] arr new int[10]; 这里只简单的举一个int开辟数组的例子。 可见java数组的创建于C语言是不同的。前面是一个int[ ]就是一个数组的数据类型&#xff0c;后面的arr是数组名&#xff0c;最后[…