C#/Unity------抽象类与接口(一篇文章彻底搞懂...)

news2025/1/16 20:15:32

抽象类/接口以及区别

SUMMARY:

具体类→抽象类→接口:越来越抽象,内部实现的东西越来越少

一、抽象类

抽象类是未完全实现逻辑的类

抽象类为复用而生,专门用作基类

封装确定的,开放不确定的,推迟到合适的子类来实现

抽象类的成员可以是私有的,受保护的,内部的

using UnityEngine;
using System;

public class OCPandObstract : MonoBehaviour
{
    private void Start()
    {
        Vehicle1 vehicle1 = new();
        vehicle1.Run();

        //无法实例化抽象类,只能实现其子类
        Vehicle2 v = new Car2();
        v.Stop();
    }
}
/// <summary>
/// 一个汽车类,一个卡车类,里面的方法都是一样的,重新写两个类就很繁琐
/// </summary>
class Car
{
    public void Run()
    {
        Console.WriteLine("Car is running ..");
    }
    public void Stop()
    {
        Console.WriteLine("Stopped...");
    }
}
class Truck
{
    public void Run()
    {
        Console.WriteLine("Car is running ..");
    }
    public void Stop()
    {
        Console.WriteLine("Stopped...");
    }
}

/// <summary>
/// 简化方法1:使用虚函数进行重写,符合开闭原则
/// </summary>
class Vehicle1
{
    public void Stop()
    {
        Console.WriteLine("Stopped...");
    }
    public virtual void Run()
    {
        Console.WriteLine("Vehicle is running...");
    }
}
class Car1:Vehicle1
{
    public override void Run()
    {
        Console.WriteLine("Car1 is running...");
    }
}
class Truck1:Vehicle1
{
    public override void Run()
    {
        Console.WriteLine("Truck1 is running...");
    }
}

/// <summary>
/// 简化方法2:,使用抽象类,抽象函数,也就是纯虚方法
/// 此时抽象类无法实例化
/// </summary>
abstract class Vehicle2
{
    public  void Stop()
    {
        Console.WriteLine("Stopped...");
    }
    /// <summary>
    /// Run需要重写,因此作为抽象函数,没有实现部分
    /// </summary>
    public abstract void Run();
}
class Car2 : Vehicle2
{
    public override void Run()
    {
        Console.WriteLine("Car2 is running...");
    }
}
class Truck2 : Vehicle2
{
    public override void Run()
    {
        Console.WriteLine("Truck2 is running...");
    }
}

上述代码一步步介绍了为什么使用抽象类,怎么使用抽象函数

抽象方法又称为纯虚方法

二、接口

接口是完全未实现逻辑的“类”

接口是“纯虚类”,只有成员函数,成员全部public

接口为解耦而生,高内聚,低耦合

继承自接口的类必须实现接口中的函数,且自身无法实现

接口中可以有属性,方法,事件,索引

接口成员默认是公开的,且不加任何修饰符

using UnityEngine;

public class OCPandInterface : MonoBehaviour
{
    
}
/// <summary>
/// 纯抽象类
/// </summary>
abstract class AnimalBase
{
    abstract public void Eat();
    abstract public void Sleep();
    abstract public void Walk();
}
/// <summary>
/// 抽象类,继承自纯抽象类
/// </summary>
abstract class Animal : AnimalBase
{
    public override void Eat()
    {

    }
    public override void Sleep()
    {

    }
}
/// <summary>
/// 具体类
/// </summary>
class Dog:Animal
{
    public override void Walk()
    {

    }
}
/// <summary>
/// 具体类
/// </summary>
class Duke : Animal
{
    public override void Walk()
    {

    }
}

/// <summary>
/// 引入interface,它成员变量默认为抽象且公开
/// </summary>
interface IAnimalBase
{
    void Eat();
    void Sleep();
    void Walk();
}
abstract class Animal1 : IAnimalBase
{
    /// <summary>
    /// 继承接口以后,也变成了具体方法
    /// </summary>
    public void Eat()
    {
        
    }

    public void Sleep()
    {

    }

    public abstract void Walk();
}
class Dog1 : Animal1
{
    public override void Walk()
    {

    }
}
class Duke1 : Animal1
{
    public override void Walk()
    {

    }
}

上述代码描述了如何引入的接口,且接口如何定义

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

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

相关文章

初识STM32单片机

目录 初识STM32单片机 什么是单片机&#xff1f; STM系列单片机命名规则 STM32F103C8T6单片机简介 标准库与HAL库区别 通用输入输出端口GPIO 什么是GPIO&#xff1f; 定义 命名规则 内部框架图 推挽输出与开漏输出 如何点亮一颗LED灯 编程实现点灯 按键点亮LED灯…

【JavaWeb】CSS基础知识:引入方式 + 选择器

目录 CSS引入 行内样式表 内部样式表 外部样式表 CSS选择器 基础选择器 标签选择器 类选择器 ID选择器 通配符选择器 复合选择器 后代选择器 子选择器 CSS引入 CSS的引入有三种&#xff0c;三种的优缺点各不相同。 行内样式表 <!-- 行内样式表 --><!--…

Splunk Add-on 碰到证书SSL问题

最近Splunk add-on 在连接对方app 的 时候,经常报SSL的错: ERROR AdminManagerExternal - Unexpected error "<class requests.exceptions.SSLError>" from python handler: "HTTPSConnectionPool(host=app.com, port=443): Max retries exceeded with…

flex布局方式让最后一个(或第二个...n)元素居右显示

<div class"round"> <div class"income">收入</div> <div class"center"> <img style"width: 12px" src"../../img/big/up.png"> </div> <div class"rg"> <span cl…

项目实战典型案例1——redis只管存不管删除 让失效时间删除的问题

redis只管存不管删除 让失效时间删除的问题一&#xff1a;背景介绍二&#xff1a;思路&方案三&#xff1a;代码模拟1.错误示范通过班级id查询课程名称执行结果通过班级id修改课程名称&#xff08;并没有删除对应缓存&#xff09;执行结果2.正确示范在错误示范的更新接口上添…

详解进程 及 探查进程

进程的概念PCB是什么task_struct的作用如何执行进程进程的探查什么是bashps命令的使用&#xff08;查看进程&#xff09;创建进程探究父子进程进程的概念 简而言之&#xff0c;进程就是正在在执行的程序 之前说过&#xff0c;程序执行的第一步Windows是双击程序Linux是 ./ &a…

vue路由篇

路由的理解 介绍 路由(英文&#xff1a;route)就是对应关系&#xff0c; 路由分为前端路由和后端路由&#xff0c;比如前端路由就是 Hash 地址与组件之间的对应关系。 具体来说&#xff1a;一个路由就是一组key-value的对应关系 key 为 url 路径value 可能是函数function 或…

反弹shell数据不回显带外查询pikaqiu靶场搭建

P1 文件上传下载&#xff08;解决无图形化和解决数据传输&#xff09; 解决无图形化&#xff1a; 当我们想下载一个文件时&#xff0c;通常是通过浏览器的一个链接直接访问网站点击下载的&#xff0c;但是在实际的安全测试中&#xff0c;我们获取的权限只是一个执行命令的窗口…

Flink 提交模式

Flink的部署方式有很多,支持Local,Standalone,Yarn,Docker,Kubernetes模式等。而根据Flink job的提交模式,又可以分为三种模式: 模式1:Application Mode Flink提交的程序,被当做集群内部Application,不再需要Client端做繁重的准备工作。(例如执行main函数,生成JobG…

sizeof以及strlen的用法以及注意事项

大家都知道&#xff0c;在c中算字符串长度和所占空间大小事不可避免的&#xff0c;甚至再有的时候&#xff0c;我们在写代码的过程中&#xff0c;就会用到这些数据。比如&#xff0c;下面这道题 struct Test { int Num; char *pcName; short sDate; char cha[2]; short sBa[4];…

Git常用命令复习笔记

1. Git与SVN区别&#xff0c;各自优缺点 Git&#xff1a; 分布式&#xff0c;每个参与开发的人的电脑上都有一个完整的仓库&#xff0c;不担心硬盘出问题&#xff1b;在不联网的情况下&#xff0c;照样可以提交到本地仓库&#xff0c;可以查看以往的所有log&#xff0c;等到有…

数据结构刷题(十七):530二叉搜索树最小绝对差、501二叉搜索树中的众数、236二叉树的最近公共祖先、235二叉搜索树的最近公共祖先

一、二叉搜索树的最小绝对差题目链接思路&#xff1a; 中序遍历保留为list for循环找最小绝对差二叉搜索树中序遍历后是有序的数组&#xff01;&#xff01;注意&#xff1a;i 1开始遍历解法&#xff1a;public int getMinimumDifference(TreeNode root) {List<Integer>…

【C++升级之路】第八篇:string类

&#x1f31f;hello&#xff0c;各位读者大大们你们好呀&#x1f31f; &#x1f36d;&#x1f36d;系列专栏&#xff1a;【C学习与应用】 ✒️✒️本篇内容&#xff1a;简单介绍string类的概念、string类的常用接口、string类的模拟实现&#xff08;各个常见接口的实现代码&…

初识数据结构——“数据结构与算法”

各位CSDN的uu们你们好呀&#xff0c;今天小雅兰进入一个全新的内容的学习&#xff0c;就是算法和数据结构啦&#xff0c;话不多说&#xff0c;让我们进入数据结构的世界吧 什么是数据结构&#xff1f; 什么是算法&#xff1f; 数据结构和算法的重要性 如何学好数据结构和算…

【开发者思维】优秀开发者应该具备的25个思维习惯

目录 1. 认真思考开发软件的目的 2. 明确软件设计的目标 3. 正确理解工作 4. 保持简洁 5. 控制复杂度 6. 软件维护 7. 保持一致 8. 优先级评测 9. 解决问题 10. 追求优秀即可 11. 预测

【MySQL中有哪些存储引擎?请你说说MySQL中innodb和myisam的区别?InnoDB引擎的三大特性?】

一.MySQL中有哪些存储引擎&#xff1f; InnoDB存储引擎 InnoDB是MySQL的默认事务型引擎&#xff0c;也是最重要、使用最广泛的存储引擎。它被设计用来处理大量的短期(short-lived)事务&#xff0c;应该优先考虑InnoDB引擎。MylSAM存储引擎 在MySQL 5.1及之前的版本&#xff0c…

PingCode 第三届开发者大会成功举办

PingCode 开发者大会或许会迟到&#xff0c;但永远不会缺席。原定于2022年10月24日举办的 “PingCode 开发者大会” 因疫情原因推迟&#xff0c;属于2022年 PingCode 开发者们的新知创想&#xff0c;不得不藏器待时。2023新春伊始&#xff0c;万象更新&#xff0c;伴随着万物逐…

不写代码、年薪百万,带你玩赚ChatGPT提示工程-高级提示

文章目录前言一、Zero-Shot提示二、Few-Shot 提示Few-shot Prompting 的局限性三、Chain-of-Thought Prompting四、Zero-Shot CoT五、Self-Consistency六、Generated Knowledge 提示七、Automatic Prompt Engineer (APE)总结前言 随着ChatGPT的大火&#xff0c;提示工程在大模…

按键修改阈值功能、报警功能、空气质量功能实现

按键修改阈值功能 要使用按键&#xff0c;首先要定义按键。通过查阅资料&#xff0c;可知按键的引脚如图所示&#xff1a;按键1&#xff08;S1&#xff09;通过KEY0与PA0连接&#xff0c;按键2&#xff08;S2&#xff09;通过KEY1与PE2连接&#xff0c;按键3&#xff08;S3&…

成本降低90%,OpenAI正式开放ChαtGΡΤ

今天凌晨&#xff0c;OpenAI官方发布ChαtGΡΤ和Whisper的接囗&#xff0c;开发人员现在可以通过API使用最新的文本生成和语音转文本功能。OpenAI称&#xff1a;通过一系列系统级优化&#xff0c;自去年12月以来&#xff0c;ChαtGΡΤ的成本降低了90%&#xff1b;现在OpenAI用…