三、C#面向对象编程(接口与实现)
在C#中,接口是一种定义方法但不包含实现的方式,可以被多个类实现以支持不同的行为。通过接口,我们可以定义一组标准的成员,让类遵循特定的契约。
下面是一个关于接口和实现的简单示例:
// 定义一个接口
public interface IAnimal
{void Speak();
}// 实现接口的类
public class Dog : IAnimal
{public void Speak(){Console.WriteLine("Woof!");}
}public class Cat : IAnimal
{public void Speak(){Console.WriteLine("Meow!");}
}
在这个例子中,我们定义了一个名为IAnimal的接口,它有一个Speak方法。然后,我们创建了两个类Dog和Cat,它们都实现了IAnimal接口,并提供了Speak方法的具体实现。这样,我们可以让不同的动物类遵循相同的契约,即它们都必须实现Speak方法。
通过接口,我们可以编写更灵活的代码。例如,我们可以编写一个接受IAnimal类型的参数的方法,并在方法内部调用Speak方法。这样,我们可以传入任何实现了IAnimal接口的对象,而不需要关心具体的类类型。
public void MakeAnimalSpeak(IAnimal animal)
{animal.Speak();
}
在这个例子中,MakeAnimalSpeak方法接受一个IAnimal类型的参数,并调用其Speak方法。由于Dog和Cat类都实现了IAnimal接口,我们可以将它们作为参数传递给这个方法。
除了上述提到的接口实现,C# 还支持多个接口的继承,一个类可以实现多个接口。例如:
public interface IAnimal
{void Speak();
}public interface IPet
{void Play();
}public class Dog : IAnimal, IPet
{public void Speak(){Console.WriteLine("Woof!");}public void Play(){Console.WriteLine("Fetch!");}
}
在这个例子中,Dog 类实现了两个接口 IAnimal 和 IPet,并提供了相应的方法实现。这样,Dog 类不仅遵循了 IAnimal 的契约,还遵循了 IPet 的契约。通过这种方式,我们可以将相关的行为组织在一起,并通过接口来定义这些行为。
此外,C# 还支持接口的继承,一个接口可以继承另一个接口的方法和属性。例如:
public interface IAnimal
{void Speak();
}public interface IPredator : IAnimal
{void Hunt();
}
在这个例子中,IPredator 接口继承了 IAnimal 接口的 Speak 方法,并添加了一个新的方法 Hunt。任何实现 IPredator 接口的类都必须实现 Speak 和 Hunt 方法。通过接口的继承,我们可以构建具有层次结构的接口,以更好地组织相关的行为。
接口的继承不仅可以帮助我们构建具有层次结构的接口,还可以提供更好的代码组织和复用。当我们需要添加新的行为时,可以通过继承现有的接口来扩展其功能,而不是重新定义一个新的接口。
此外,C# 还支持抽象类实现接口。抽象类可以包含抽象成员和具体成员,它可以被继承并实现其抽象成员。通过抽象类实现接口,我们可以将接口的实现逻辑封装在抽象类中,使得实现更加灵活和可复用。
下面是一个示例,演示如何使用抽象类实现接口:
public interface IAnimal
{void Speak();
}public abstract class AnimalBase : IAnimal
{public abstract void Speak();
}public class Dog : AnimalBase
{public override void Speak(){Console.WriteLine("Woof!");}
}
在这个例子中,我们定义了一个接口 IAnimal 和一个抽象类 AnimalBase,它实现了 IAnimal 接口。然后,我们创建了一个 Dog 类,它继承了 AnimalBase 类并实现了 Speak 方法。通过这种方式,我们可以将 IAnimal 接口的实现逻辑封装在 AnimalBase 抽象类中,使得 Dog 类可以更加专注于自己的特定行为。
相关文章:
三、C#面向对象编程(接口与实现)
在C#中,接口是一种定义方法但不包含实现的方式,可以被多个类实现以支持不同的行为。通过接口,我们可以定义一组标准的成员,让类遵循特定的契约。 下面是一个关于接口和实现的简单示例: // 定义一个接口 public inter…...
【java爬虫】股票数据获取工具前后端代码
前面我们有好多文章都是在介绍股票数据获取工具,这是一个前后端分离项目 后端技术栈:springboot,sqlite,jdbcTemplate,okhttp 前端技术栈:vue,element-plus,echarts,ax…...
Scikit-Learn线性回归(四)
Scikit-Learn线性回归四:梯度下降 1、梯度下降1.1、梯度下降概述1.2、梯度下降及原理1.3、梯度下降的实现2、梯度下降法求解线性回归的最优解2.1、梯度下降法求解的原理2.2、梯度下降法求解线性回归的最优解2.3、梯度下降法求解线性回归案例(波士顿房价预测)3、Scikit-Learn…...
SCT2330C——3.8V-28V输入,3A,低EMI,超低功耗同步降压DCDC转换器
描述: SCT2330C是3A同步buck变换器,输入电压范围高达28V,完全集成了80mΩ高压侧MOSFET和42mΩ低压侧MOSFET,提供高效降压DC-DC转换。SCT2330C采用峰值电流模式控制,集成补偿网络,通过最小化片外元件数量&a…...
php生成唯一ID的5种方法介绍
php生成唯一ID的5种方法介绍 工作中使用到唯一ID的场景非常多,如临时缓存文件、临时变量、临时安全码等。 uniqid()函数基于以微妙计的当前时间,生成一个唯一的ID。由于生成唯一ID与微妙时间关联,因此生成ID的唯一性非常可靠。 生成的唯一…...
向日葵远程工具安装Mysql的安装与配置
目录 一、向日葵远程工具安装 1.1 简介 1.2 下载地址 二、Mysql 5.7 安装与配置 2.1 简介 2.2 安装 2.3 初始化mysql服务端 2.4 启动mysql服务 2.5 登录mysql 2.6 修改密码 2.7 设置外部访问 三、思维导图 一、向日葵远程工具安装 1.1 简介 向日葵远程控制是一款用…...
Unity 欧盟UMP用户隐私协议Android接入指南
Unity 欧盟UMP用户协议Android接入指南 官方文档链接开始接入mainTemplate.gradle 中引入CustomUnityPlayerActivity 导入UMP相关的包java类中新增字段初始化UMPSDK方法调用测…...
AutoLisp入门教程
AutoLisp入门教程 大家好,我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!在编程的世界里,有许多领域和语言需要我们去探索,今天我们将聚焦于 AutoLI…...
matplotlib颜色合集——各种常见简单图形(上)
一、.颜色配图表 图文颜色引用:建站教程 - FINTHON 二、折线图 jupyter notebook 简介plot() 2.1折线图参数 plt.plot(*args, scalexTrue, scaleyTrue, dataNone, **kwargs) 2.2、参数介绍 x:X轴数据,列表或数组,可选。 y&a…...
小H靶场笔记:DC-3
DC-3 January 3, 2024 4:11 PM Tags:Joomla owner:只惠摸鱼 信息收集 探测靶机ip: 192.168.199.133 nmap 扫描端口、 系统版本 漏洞 发现只有80端口开发, 且有cve-2017-8917漏洞存在是Joomla的SQL注入漏洞 Joomla版本为3.7.0…...
Web网页开发-CSS高级技巧2-笔记
1.已知宽高垂直水平居中 定位负margin法: 利用top:50%;left:50%;margin-left:子盒子宽度的一半;margin-top:子盒子高度的一半; 2.不定宽高垂直水平居中 兼容性最好的方案: 用定位margin:auto,定位 四个方向的值相等margin:auto…...
C++面向对象语法总结(二)
目录 《C基础语法总结》《C面向对象语法总结(一)》 十一、继承 继承,可以让子类拥有父类的多有成员(变量、函数)如下面的代码:Student是子类(subclass,派生类),Person是父类&…...
【LeetCode每日一题】2487. 从链表中移除节点(调用栈+递归+翻转链表)
2024-1-3 文章目录 [2487. 从链表中移除节点](https://leetcode.cn/problems/remove-nodes-from-linked-list/)方法一:调用栈方法二:递归方法三:翻转链表 2487. 从链表中移除节点 方法一:调用栈 1.将所有节点按顺序压入栈中 2.从…...
开源协助平台工程灵活应对多云时代的挑战
平台工程通过标准化控制和灵活性保障了开发实践。但是,随着平台工程的兴起,开源战略又该如何融入其中呢? 虽然平台工程没有一刀切的方法,但越来越明显的是,开源软件和技术对平台工程的成功绝对至关重要——这一点我将在…...
Springboot通过profiles切换不同环境使用的配置
文章目录 简介1.通过分隔符隔离2.通过使用不同的配置文件区分3.测试 简介 一个项目从开发到上线一般要经过几个环境, dev测试环境-uat预生产环境-prod生产环境,每个环境的使用的数据库或者配置不同,这时候可以通过下面两种方式区分配置,达到快速切换的效…...
SpringBoot入门到精通-Spring Boot Jasypt Encrypt 演示
这是 spring boot 应用程序,展示了如何使用 Jasypt 加密值。 关于Jasypt Jasypt 为您提供简单的单向(摘要)和双向加密技术。开放 API,可与任何 JCE 提供程序一起使用,而不仅仅是默认的 Java VM 提供程序。Jasypt 可以很容易地与 Bouncy Castle 等知名提供商一起使用。了解…...
整数的阶乘(英语:factorial)是所有小于及等于
整数的阶乘(英语:factorial)是所有小于及等于该数的正整数的积,0的阶乘为1。即:n!123...n。 实例 #!/usr/bin/python3 # Filename : test.py # author by : www.dida100.com # 通过用户输入数字计算阶乘 # 获…...
音视频通信
文章目录 一、音视频通信流程二、流媒体协议1、RTSP2、RTMP3、HLS4、WebRTC 一、音视频通信流程 音视频通信完整流程有如下几个环节:采集、编码、前后处理、传输、解码、缓冲、渲染等。 每一个细分环节,还有更细分的技术模块。比如,前后处…...
docker 搭建gitlab 恢复和备份
最近一直在折腾gitlab 代码管理系统 采用docker搭建 镜像网址 https://hub.docker.com/ 技术交流 http://idea.coderyj.com/ 1.因为我要恢复的版本是12.0.9的所有我就下载了docker-ce的12.0.9的镜像 1.下载镜像 docker pull gitlab/gitlab-ce:12.0.9-ce.02.安装 docker run …...
尚硅谷2023版Promise教程从入门到实战(讲师:任安萍)
一、前言:为什么会出现Promise? Promise的重要性我认为没有必要多讲,概括起来说就是五个字:必!须!得!掌!握!。 而且还要掌握透彻,在实际的使用中,有非常多…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...
【C++进阶篇】智能指针
C内存管理终极指南:智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...
为什么要创建 Vue 实例
核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...
论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing
Muffin 论文 现有方法 CRADLE 和 LEMON,依赖模型推理阶段输出进行差分测试,但在训练阶段是不可行的,因为训练阶段直到最后才有固定输出,中间过程是不断变化的。API 库覆盖低,因为各个 API 都是在各种具体场景下使用。…...
华为OD机试-最短木板长度-二分法(A卷,100分)
此题是一个最大化最小值的典型例题, 因为搜索范围是有界的,上界最大木板长度补充的全部木料长度,下界最小木板长度; 即left0,right10^6; 我们可以设置一个候选值x(mid),将木板的长度全部都补充到x,如果成功…...
LOOI机器人的技术实现解析:从手势识别到边缘检测
LOOI机器人作为一款创新的AI硬件产品,通过将智能手机转变为具有情感交互能力的桌面机器人,展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家,我将全面解析LOOI的技术实现架构,特别是其手势识别、物体识别和环境…...
Linux操作系统共享Windows操作系统的文件
目录 一、共享文件 二、挂载 一、共享文件 点击虚拟机选项-设置 点击选项,设置文件夹共享为总是启用,点击添加,可添加需要共享的文件夹 查询是否共享成功 ls /mnt/hgfs 如果显示Download(这是我共享的文件夹)&…...
LINUX编译vlc
下载 VideoLAN / VLC GitLab 选择最新的发布版本 准备 sudo apt install -y xcb bison sudo apt install -y autopoint sudo apt install -y autoconf automake libtool编译ffmpeg LINUX FFMPEG编译汇总(最简化)_底部的附件列表中】: ffmpeg - lzip…...
