C#难点语法讲解之abstract---从应用需求开始讲解

news2024/12/27 0:33:53

一、背景故事

我们正常写的脚本,一般都是非常完整的,脚本完整意味着需求完整。

例如,我是售货员,现在苹果5元,梨子3元,西瓜20元,

一个人,来买了5个苹果,4个梨子,1个西瓜,问多少钱?

这样的代码都很好写,因为需求完整,想法完整,逻辑清晰。

二、残酷的现实

现实往往没办法一下考虑那么多。

例如:现在我不知道买东西的人拿了什么,但是我必须先把式子列出来,我必须把计算公式列出来,可我也不知道买了多少,每个东西多少钱,这都要后面补充,但我现在就要硬算。

解决方案:那我就假设有个数组FruitsPrice,

里面是它拿的所有东西的单价,我给他们加起来 

    //这就是假设的那个数组
    int[] FruitsPrice;

    public int result() {
        int sum = 0;
                               
        foreach (int price in FruitsPrice())
        {
            sum += price;
        }

        return sum;
    }

 但是有个问题,我们的int数组,本质上是不知道的,而且,我们以后还要去改它,所以,我们要把它写成一个方法。

然后就报错了~~接下来就变成了一个死循环。。

我们不知道这个数组→我们又需要这个数组→这个数组我们不知道

三、所有语法都是为了解决实际问题-------abstract

当挂上abstract后,它再也不会要求你写代码了,因为它默认这就是个假设,是个半成品,它也就让你过了。(不用加{},因为不需要你去写方法)

如果,你这时候还被报错了,你大概是遇见

这个理由也很简单,它发现你这个脚本里,有方法是半成品啊,

它就觉得,保不齐,这个代码也执行不了,里面的方法也不能用,

所以,这个脚本,默认是个不能直接使用的脚本,

我们就也必须把这个脚本叫做假设脚本或者抽象脚本,抽象的就是不能用的嘛!

 

 我们现在整体代码就是:

using UnityEngine;

public abstract class Test_Abstract : MonoBehaviour
{
    public abstract int[] FruitsPrice();
    public int result()
    {
        int sum = 0;
        foreach (int price in FruitsPrice())
        {
            sum += price;
        }
        return sum;
    }
}

四、我不能直接写int吗?

a.可能你会好奇,我刚才是写了一个可以传递int数组的方法,如果我直接声明数组可以吗?

例:

肯定不可以啊,都说了abstract是个假设,假设就是不知道是多少,可是从你声明的那一刻起,你就知道他是多少了(如果不设置值,默认为0),都知道了,就不是假设了,所以不可以。

b.那如果我硬要设置呢?

我们有抽象访问器,就是

因为这个没有默认值,所以是可以设置哒。

五、abstract总结

 1.官方话:抽象类不能实例化。在方法或属性声明中使用 abstract 修饰符以指示方法或属性不包含实现。

人话:写抽象方法的时候,不能实现(就是不能加{},然后往里面写内容)

吐槽:抽象方法就是因为没法实现才写抽象,能实现就直接写方法了.........

2.官方话:只允许在抽象类中使用抽象方法声明。

人话:抽象方法必须写在抽象类里

吐槽:(方法都是假设的了,你脚本只能是假设的)

3.官方话:从抽象类派生的非抽象类必须包括继承的所有抽象方法和抽象访问器的实际实现。

人话:我们写的都是假设方法了,用的话,不能直接new 一个,都是假的,所以没法new,只能用继承的方法,继承了以后,如果一直是假的,你就还是没办法用,所以继承以后,必须重写(override)一下这个方法,要不然会导致你的子子孙孙无穷假设,脚本都是坏掉的。

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

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

相关文章

springcloud二回头

Spring Cloud 一种微服务,以往的单体项目在一定程度的累积后,一些服务需要进行拆分,独立进行开发,然后再合起来,之前的是装成一个包进行部署 不同的搭配: spring cloud和boot的对应版本: Rest…

JavaScript 内置对象 数据类型

目录 JavaScript 内置对象 1.内置对象 2.查文档 2.1MDN 2.2 如何学习对象中的方法 3.Math对象 3.1Math 概述 3.2随机数方法 random() 4. 日期对象 4.1Date 概述 4.2Date() 方法的使用 4.3 日期格式化 4.4获取毫秒的总的毫秒形式 5.数组对象 5.1数组对象的创建 5…

1. Netty核心功能与线程模型详解

Netty 1. 认识Netty2. 第一个Netty程序 本文是按照自己的理解进行笔记总结,如有不正确的地方,还望大佬多多指点纠正,勿喷。 课程内容: 01、Netty核心组件快速了解 02、Hello,Netty! 03、深入理解Channel、EventLoop(Group) 04、深…

MySql的使用

目录 一、安装与启动1.1 Ubuntu下的使用1.2 Mac下的使用 二、MySQL图形化管理工具的使用三、数据完整性3.1 数据类型3.2 约束 四、常用的sql语句4.1 数据库操作4.2 数据库表操作1.查看当前数据库中所有表2.查看建表的数据结构3.创建表4.添加字段5.修改字段6. 删除字段7. 查看表…

nodejs之net模块的使用

vscode的底层ipc通讯都是基于node的net模块进行封装,今天大概讲解下net模块的使用 官方文档地址:https://nodejs.cn/api/net.html net模块的作用 net模块提供了基于流的方式构建tcp或ipc服务器和客户端的能力。 node:net 模块提供异步网络 API&#x…

ChatGPT发展与技术基础

一、ChatGPT发展 【ChatGPT——GPT3.5】 诞生于:2022 年 11 月 类型:对话场景的大语言模型 特点:更贴近人的方式与使用者互动;在理解人类意图、精准回答问题、流畅生成结果方面远超人类预期。 功能:可以回答问题、…

bug--两个表格,数据来自于同一个抽屉表格,现在让两个表格的数据 不能一样--处理checked 和 disabled

步骤一、拿到表格数据 步骤二、处理 checked,要区分是A表 还是B表,这个区分要在 A表、B表 数据展示的组件里(根源)区分 : 点击A表,抽屉表格中A 已选的状态 是 checked 且 disabled,B 已选的 抽…

HCIA复习一

OSI七层模型 7.应用层: 用于人机交互,将抽象语言转化为编码; 6.表示层: 将编码转换为二进制;(加解密,压缩解压缩) 5.会话层: 管理通信双方的会话,细分为…

数模笔记6.30

目录 一、基础 建模步骤: 论文格式: 写作过程: 赛题类型: 二、优化类模型 2.1简单的优化模型 2.2数学规划模型 三、Lingo 一、基础 建模步骤: 找目标 找条件(变量、常量、自己的假设&#xff09…

Tomcat的优化多实例部署

一.tomcat核心组件模块 1.web容器:接受.响应请求 2.展示动态页面 2..JSP容器:翻译java---》servlet 3.serverlet容器:serverlet代码格式是用于JSP容器处理 简述: web容器 :1.接受、响应请求 2.展示动态页面 JSP容…

python之 flask 框架

创建安装虚拟环境 两种方法 第二种 # 先打开cmd 中断 # 查看virtual是否安装过 pip show virtualenv # 安装 pip install virtualenvwrapper-win # workon 查看虚拟环境 vorkon # 切换虚拟环境 # workon 虚拟环境 # mkvirtualenv 创建新的虚拟环境 mkvirtualenv falsk2…

MySQL 字符集与比较规则

字符集与比较规则 一. 字符集相关操作1. 查看字符集1.1 查看数据库当前字符集配置1.2 查看某数据库/数据表字符集 2. 修改字符集2.1 全局修改字符集2.2 修改已有库表字符集 3. 字符集级别二. 比较规则1. 后缀表示含义2. 查看指定数据集比较规则3. 查看/修改数据库/表比较规则 一…

计算机视觉:窥探数字世界的眼睛

目录 简介: 一. 计算机视觉的起源与发展 二. 计算机视觉的应用领域 三. 计算机视觉的挑战与未来发展 结论: 简介: 计算机视觉(Computer Vision)是人工智能(AI)领域中的一个重要分支&#…

同一VLAN不同交换机之间的数据转发

实验环境: 思科模拟器,Cisco Packet Tracer 实验拓扑: 配置步骤: (1)配置四台PC的IP地址 双击PC选择Desktop,然后选择IP Configuration配置ip (2)配置交换机 双击交换…

登录校验-interceptor/拦截器

Interceptor 概念:拦截前端对后端的某些请求 使用步骤 自定义拦截器类,实现HandlerInterceptor接口,重写所有的方法(preHandle方法在controller执行之前执行、【postHandle、afterCompletion】在controller执行后执行&#xff0…

基于java,springboot的零食零售系统设计与实现

背景 本系统实现管理员:首页、个人中心、用户管理、零食分类管理、零食信息管理、订单评价管理、系统管理、订单管理,用户;首页、个人中心、订单评价管理、我的收藏管理、订单管理,前台首页;首页、零食信息、零食资讯…

Vue工程创建及应用

🙈作者简介:练习时长两年半的Java up主 🙉个人主页:程序员老茶 🙊 ps:点赞👍是免费的,却可以让写博客的作者开兴好久好久😎 📚系列专栏:Java全栈,…

Python Pandas之loc、iloc

df.loc 通过标签索引获取数据 df.iloc 通过位置索引获取数据

Airtest:Windows桌面应用自动化测试二【Airtest基于图像识别自动控制手机App流程】

Airtest基于图像识别自动控制手机App流程 一、Airtest基于图像识别自动控制手机App流程二、基于图像识别生成脚本有两种操作:三、Airtest基于Poco的UI组件自动化控制App流程四、Airtest实现手机群控操作 Airtest介绍与脚本入门 Airtest相关api操作 一、Airtest基于…

暑期学JavaScript【第三天】

事件流 很多时候,一个事件可能会被多个元素监听。那么这些元素应该按什么顺序响应呢?从父到子称为捕获,从子到父称为冒泡。 事件捕获 可选参数,true or fause,带true代表按捕获方式响应 obj.addEventListener(cli…