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

news2024/11/24 0:54:56

面向对象-继承

在这里插入图片描述

文章目录

      • 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;
string
    object 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.coloradmin.cn/o/1641114.html

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

相关文章

8.k8s中网络资源service

目录 一、service资源概述 二、service资源类型 1.ClusterIP类型 2.service的nodeport类型 3.service的loadbalancer类型&#xff08;了解即可&#xff09; 4.service的externalname类型&#xff08;了解即可&#xff09; 三、nodeport的端口范围设置和svc的endpoint列表 1.修…

扩散模型(Diffusion Model)概述

扩散模型&#xff08;Diffusion Model&#xff09;是图像生成模型的一种。有别于此前 AI 领域大名鼎鼎的 GAN、VAE 等算法&#xff0c;扩散模型另辟蹊径&#xff0c;其主要思想是一种先对图像增加噪声&#xff0c;再逐步去噪的过程&#xff0c;其中如何去噪还原图像是算法的核心…

web3风格的网页怎么设计?分享几个,找找感觉。

web3风格的网站是指基于区块链技术和去中心化理念的网站设计风格。这种设计风格强调开放性、透明性和用户自治&#xff0c;体现了Web3的核心价值观。 以下是一些常见的Web3风格网站设计元素&#xff1a; 去中心化标志&#xff1a;在网站的设计中使用去中心化的标志&#xff0…

RocketMQ SpringBoot 3.0不兼容解决方案

很多小伙伴在项目升级到springBoot3.0版本以上之后&#xff0c;整合很多中间件会有很多问题&#xff0c;下面带小伙伴解决springBoot3.0版本以上对于RocketMQ 不兼容问题 报错信息 *************************** APPLICATION FAILED TO START *************************** Des…

深入 Django 模型层:数据库设计与 ORM 实践指南

title: 深入 Django 模型层&#xff1a;数据库设计与 ORM 实践指南 date: 2024/5/3 18:25:33 updated: 2024/5/3 18:25:33 categories: 后端开发 tags: Django ORM模型设计数据库关系性能优化数据安全查询操作模型继承 第一章&#xff1a;引言 Django是一个基于Python的开源…

Lucene从入门到精通

**************************************************************************************************************************************************************************** 1、概述 【1】入门&#xff1a;作用、有点与缺点 【2】应用&#xff1a;索引、搜索、fie…

最短路径(朴素)+堆排序+模拟堆

文章目录 Dijkstra求最短路 I堆排序模拟堆 Dijkstra求最短路 I 给定一个 n 个点 m 条边的有向图&#xff0c;图中可能存在重边和自环&#xff0c;所有边权均为正值。 请你求出 1 号点到 n 号点的最短距离&#xff0c;如果无法从 1 号点走到 n 号点&#xff0c;则输出 −1。 输…

对命令模式的理解

目录 一、场景1、文本编辑器并不是一个好的例子&#xff0c;设备控制器才是2、设备控制器的demo 二、不用命令模式1、代码2、问题 三、使用命令模式1、代码2、当需求变化时2.1 新增代码2.2 优点 四、进一步思考1、省略对Command的建模可以吗&#xff1f;2、命令模式的价值 一、…

香港理工大学内地事务总监陆海天教授确认出席“边缘智能2024 - AI开发者峰会”并发表主题演讲

隨著AI技術的日新月異&#xff0c;我們正步入一個邊緣計算智能化與分布式AI相互融合的新紀元。這一變革不僅推動了分布式智能創新應用的飛速發展&#xff0c;還使得邊緣智能——這一結合邊緣計算和智能技術的新興領域&#xff0c;逐漸成為引領AI發展的重要力量。通過其分布式和…

# 从浅入深 学习 SpringCloud 微服务架构(八)Sentinel(1)

从浅入深 学习 SpringCloud 微服务架构&#xff08;八&#xff09;Sentinel&#xff08;1&#xff09; 一、sentinel&#xff1a;概述 1、前言 – 服务熔断 Hystrix 的替换方案。 1&#xff09;2018年底 Netflix 官方宣布 Hystrix 已经足够稳定&#xff0c;不再积极开发 Hys…

基于AT89C52单片机的智能热水器控制系统

点击链接获取Keil源码与Project Backups仿真图&#xff1a; https://download.csdn.net/download/qq_64505944/89242443?spm1001.2014.3001.5503 C 源码仿真图毕业设计实物制作步骤05 题 目 基于单片机的智能热水器系统 学 院 专 业 班 级 学 号 学生姓名 指导教师 完成日期…

【Docker学习】docker version查看版本信息

就像很多应用一样&#xff0c;docker也使用version来查看版本信息。但因为docker包含有不少独立组件&#xff0c;version的作用范围会更广一些。 用法1&#xff1a; docker --version 描述&#xff1a; 输出安装的Docker CLI 的版本号。关于Docker CLI&#xff0c;请访问。 实操…

Ubuntu启动后进入GRUB故障-Minimal BASH like line editing is supported.

目录 1.问题描述 2.解决方案 2.1 临时性办法 2.2 工具永久性修复 总结 1.问题描述 PC安装Ubuntu系统第二天重启后提示GUN GRUB version 2.04&#xff0c;之前是WindowsOS装Ubuntu后无法进入图形界面。具体原因据网友提供线索据说是由于在Windows上进行更新/重装/修改了引…

Golang | Leetcode Golang题解之第66题加一

题目&#xff1a; 题解&#xff1a; func plusOne(digits []int) []int {n : len(digits)for i : n - 1; i > 0; i-- {if digits[i] ! 9 {digits[i]for j : i 1; j < n; j {digits[j] 0}return digits}}// digits 中所有的元素均为 9digits make([]int, n1)digits[0]…

Docker-Compose编排LNMP并部署WordPress

前言 随着云计算和容器化技术的快速发展&#xff0c;使用 Docker Compose 编排 LNMP 环境已经成为快速部署 Web 应用程序的一种流行方式。LNMP 环境由 Linux、Nginx、MySQL 和 PHP 组成&#xff0c;为运行 Web 应用提供了稳定的基础。本文将介绍如何通过 Docker Compose 编排 …

【深度学习】第一门课 神经网络和深度学习 Week 3 浅层神经网络

&#x1f680;Write In Front&#x1f680; &#x1f4dd;个人主页&#xff1a;令夏二十三 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd; &#x1f4e3;系列专栏&#xff1a;深度学习 &#x1f4ac;总结&#xff1a;希望你看完之后&#xff0c;能对…

20240503解决Ubuntu20.04和WIN10双系统下WIN10的时间异常的问题

20240503解决Ubuntu20.04和WIN10双系统下WIN10的时间异常的问题 2024/5/3 9:33 缘起&#xff1a;因为工作需要&#xff0c;编译服务器上都会安装Ubuntu20.04。 但是因为WINDOWS强悍的生态系统&#xff0c;偶尔还是有必须要用WINDOWS的时候&#xff0c;于是也安装了WIN10。 双系…

AJ-Report开源数据大屏 verification;swagger-ui RCE漏洞复现

0x01 产品简介 AJ-Report是一个完全开源的BI平台,酷炫大屏展示,能随时随地掌控业务动态,让每个决策都有数据支撑。多数据源支持,内置mysql、elasticsearch、kudu等多种驱动,支持自定义数据集省去数据接口开发,支持17+种大屏组件,不会开发,照着设计稿也可以制作大屏。三…

Linux进程——Linux下常见的进程状态

前言&#xff1a;在进程学习这一块&#xff0c;我们主要学习的就是PCB这个进程控制块&#xff0c;而PBC就是用来描述进程的结构体&#xff0c;而进程状态就是PCB结构体中的一个变量。 本篇主要内容&#xff1a; 操作系统中的进程状态Linux下的进程状态 在开始之前&#xff0c;我…

MLP手写数字识别(2)-模型构建、训练与识别(tensorflow)

查看tensorflow版本 import tensorflow as tfprint(Tensorflow Version:{}.format(tf.__version__)) print(tf.config.list_physical_devices())1.MNIST的数据集下载与预处理 import tensorflow as tf from keras.datasets import mnist from keras.utils import to_categori…