当前位置: 首页 > news >正文

C# 面向对象的接口

接口,多态性,密封类

C# 接口

遥控器是观众和电视之间的接口。 它是此电子设备的接口。 外交礼仪指导外交领域的所有活动。 道路规则是驾车者,骑自行车者和行人必须遵守的规则。 编程中的接口类似于前面的示例。

接口是:

  • APIs
  • Contracts

对象通过其公开的方法与外界交互。 实际的实现对程序员而言并不重要,或者也可能是秘密的。 公司可能会出售图书馆,但它不想透露实际的实施情况。 程序员可能会在 GUI 工具箱的窗口上调用Maximize()方法,但对如何实现此方法一无所知。 从这个角度来看,接口是对象与外界交互的方式,而又不会过多地暴露其内部功能。

从第二个角度来看,接口就是契约。 如果达成协议,则必须遵循。 它们用于设计应用的体系结构。 他们帮助组织代码。

接口是完全抽象的类型。 它们使用interface关键字声明。 接口只能具有方法,属性,事件或索引器的签名。 所有接口成员都隐式具有公共访问权限。 接口成员不能指定访问修饰符。 接口不能具有完全实现的方法,也不能具有成员字段。 C# 类可以实现任何数量的接口。 一个接口还可以扩展任何数量的接口。 实现接口的类必须实现接口的所有方法签名。

接口用于模拟多重继承。 C# 类只能从一个类继承,但可以实现多个接口。 使用接口的多重继承与继承方法和变量无关。 它是关于继承想法或合同的,这些想法或合同由接口描述。

接口和抽象类之间有一个重要的区别。 抽象类为继承层次结构中相关的类提供部分实现。 另一方面,可以通过彼此不相关的类来实现接口。 例如,我们有两个按钮。 经典按钮和圆形按钮。 两者都继承自抽象按钮类,该类为所有按钮提供了一些通用功能。 实现类是相关的,因为它们都是按钮。 另一个示例可能具有类DatabaseSignIn。 它们彼此无关。 我们可以应用ILoggable接口,该接口将迫使他们创建执行日志记录的方法。

C# 简单接口

以下程序使用一个简单的接口。

Program.
using System;namespace SimpleInterface
{interface IInfo{void DoInform();}class Some : IInfo{public void DoInform(){Console.WriteLine("This is Some Class");}}class Program{static void Main(string[] args){var some = new Some();some.DoInform();}}
}

这是一个演示接口的简单 C# 程序。

interface IInfo
{void DoInform();   
}

这是接口IInfo。 它具有DoInform()方法签名。

class Some : IInfo

我们实现了IInfo接口。 为了实现特定的接口,我们使用冒号(:)运算符。

public void DoInform()
{Console.WriteLine("This is Some Class");
}

该类提供了DoInform()方法的实现。

C# 多个接口

下一个示例显示了一个类如何实现多个接口。

Program.
using System;namespace MultipleInterfaces
{interface Device{void SwitchOn();void SwitchOff();}interface Volume{void VolumeUp();void VolumeDown();}interface Pluggable{void PlugIn();void PlugOff();}class CellPhone : Device, Volume, Pluggable{public void SwitchOn(){Console.WriteLine("Switching on");}public void SwitchOff(){Console.WriteLine("Switching on");}public void VolumeUp(){Console.WriteLine("Volume up");}public void VolumeDown(){Console.WriteLine("Volume down");}public void PlugIn(){Console.WriteLine("Plugging In");}public void PlugOff(){Console.WriteLine("Plugging Off");}}class Program{static void Main(string[] args){var cellPhone = new CellPhone();cellPhone.SwitchOn();cellPhone.VolumeUp();cellPhone.PlugIn();}}
}

我们有一个CellPhone类,它从三个接口继承。

class CellPhone : Device, Volume, Pluggable

该类实现所有三个接口,并用逗号分隔。 CellPhone类必须实现来自所有三个接口的所有方法签名。

$ dotnet run
Switching on
Volume up
Plugging In

运行程序,我们得到此输出。

C# 多接口继承

下一个示例显示接口如何从多个其他接口继承。

Program.
using System;namespace InterfaceInheritance
{interface IInfo{void DoInform();}interface IVersion{void GetVersion();}interface ILog : IInfo, IVersion{void DoLog();}class DBConnect : ILog{public void DoInform(){Console.WriteLine("This is DBConnect class");}public void GetVersion(){Console.WriteLine("Version 1.02");}public void DoLog(){Console.WriteLine("Logging");}public void Connect(){Console.WriteLine("Connecting to the database");}}class Program{static void Main(string[] args){var db = new DBConnect();db.DoInform();db.GetVersion();db.DoLog();db.Connect();}}
}

我们定义了三个接口。 我们可以按层次结构组织接口。

interface ILog : IInfo, IVersion

ILog接口继承自其他两个接口。

public void DoInform() 
{Console.WriteLine("This is DBConnect class");
}

DBConnect类实现DoInform()方法。 该方法由该类实现的ILog接口继承。

$ dotnet run
This is DBConnect class
Version 1.02
Logging
Connecting to the database

这是输出。

C# 多态性

多态是以不同方式将运算符或函数用于不同数据输入的过程。 实际上,多态性意味着如果类 B 从类 A 继承,那么它不必继承关于类 A 的所有内容。 它可以完成 A 类所做的某些事情。

通常,多态性是以不同形式出现的能力。 从技术上讲,它是重新定义派生类的方法的能力。 多态性与将特定实现应用于接口或更通用的基类有关。

多态性是重新定义派生类的方法的能力。

Program.
using System;namespace Polymorphism
{abstract class Shape{protected int x;protected int y;public abstract int Area();}class Rectangle : Shape{public Rectangle(int x, int y){this.x = x;this.y = y;}public override int Area(){return this.x * this.y;}}class Square : Shape{public Square(int x){this.x = x;}public override int Area(){return this.x * this.x;}}class Program{static void Main(string[] args){Shape[] shapes = { new Square(5), new Rectangle(9, 4), new Square(12) };foreach (Shape shape in shapes){Console.WriteLine(shape.Area());}}}
}

在上面的程序中,我们有一个抽象的Shape类。 此类演变为两个后代类别:RectangleSquare。 两者都提供了自己的Area()方法实现。 多态为 OOP 系统带来了灵活性和可伸缩性。

public override int Area()
{return this.x * this.y;
}
...
public override int Area()
{return this.x * this.x;
}

RectangleSquare类具有Area()方法的自己的实现。

Shape[] shapes = { new Square(5), new Rectangle(9, 4), new Square(12) };

我们创建三个形状的数组。

foreach (Shape shape in shapes)
{Console.WriteLine(shape.Area());
}

我们遍历每个形状,并在其上调用Area()方法。 编译器为每种形状调用正确的方法。 这就是多态性的本质。

C# 密封类

sealed关键字用于防止意外地从类派生。 密封类不能是抽象类。

Program.
using System;namespace DerivedMath
{sealed class Math{public static double GetPI(){return 3.141592;}}class Derived : Math{public void Say(){Console.WriteLine("Derived class");}}class Program{static void Main(string[] args){var dm = new Derived();dm.Say();}}
}

在上面的程序中,我们有一个Math基类。 该类的唯一目的是为程序员提供一些有用的方法和常量。 (出于简单起见,在我们的案例中,我们只有一种方法。)它不是从继承而创建的。 为了防止不知情的其他程序员从此类中派生,创建者创建了sealed类。 如果尝试编译该程序,则会出现以下错误:’Derived’不能从密封类’Math’派生。

相关文章:

C# 面向对象的接口

接口,多态性,密封类 C# 接口 遥控器是观众和电视之间的接口。 它是此电子设备的接口。 外交礼仪指导外交领域的所有活动。 道路规则是驾车者,骑自行车者和行人必须遵守的规则。 编程中的接口类似于前面的示例。 接口是: APIsC…...

使用IDEA+Maven实现MapReduced的WordCount

使用IDEAMaven实现MapReduce 准备工作 在桌面创建文件wordfile1.txt I love Spark I love Hadoop在桌面创建文件wordfile2.txt Hadoop is good Spark is fast上传文件到Hadoop # 启动Hadoop cd /usr/local/hadoop ./sbin/start-dfs.sh # 删除HDFS的hadoop对应的input和out…...

go语言示例代码

go语言示例代码, package mainimport "fmt" import "encoding/json"func main() {list : []int{11, 12, 13, 14, 15}for i,x : range list {fmt.Println("i ", i, ",x ", x)}fmt.Println("")for i : range l…...

华为云容器监控平台

首先搜索CCE,点击云容器引擎CCE 有不同的测试,生产,正式环境 工作负载--直接查询服务名看监控 数据库都是走的一个 Redis的查看...

阿里短信发送报错 InvalidTimeStamp.Expired

背景 给客户做的人力资源系统,今天客户用阿里云短信,结果报错: nvalidTimeStamp.Expired Specified time stamp or date value is expired. HTTP Status: 400 RequestID: A 怎么办呢?搜资料, 是客户端时间&#xff…...

Ubuntu问题 -- 设置ubuntu的IP为静态IP (图形化界面设置) 小白友好

目的 为了将ubuntu服务器IP固定, 方便ssh连接人在服务器前使用图形化界面设置 设置 找到自己的网卡名称, 我的是 eno1, 并进入设置界面 查看当前的IP, 网关, 掩码和DNS (注意对应eno1) nmcli dev show掩码可以通过以下命令查看完整的 (注意对应eno1) , 我这里是255.255.255.…...

Sigrity SPEED2000 TDR TDT Simulation模式如何进行时域阻抗仿真分析操作指导-差分信号

Sigrity SPEED2000 TDR TDT Simulation模式如何进行时域阻抗仿真分析操作指导-差分信号 Sigrity SPEED2000 TDR TDT Simulation模式如何进行时域阻抗仿真分析操作指导-单端信号详细介绍了单端信号如何进行TDR仿真分析,下面介绍如何对差分信号进行TDR分析,还是以下图为例进行分…...

Cesium 加载B3DM模型

一、引入Cesium&#xff0c;可以使用该链接下载cesium 链接: https://pan.baidu.com/s/1BRQyaFCkxO2xQQT5RzFUCw?pwdkcv9 提取码: kcv9 在index.html文件中引入cesium <script type"text/javascript" src"/Cesium/Cesium.js"></script> …...

阿里巴巴官方「SpringCloudAlibaba全彩学习手册」限时开源!

最近我在知乎上看过的一个热门回答&#xff1a; 初级 Java 开发面临的最大瓶颈在于&#xff0c;脱离不出自身业务带来的局限。日常工作中大部分时间在增删改查、写写接口、改改 bug&#xff0c;久而久之就会发现&#xff0c;自己的技术水平跟刚工作时相比没什么进步。 所以我们…...

Docker是一个容器化平台注意事项

Docker本身是一个容器化平台&#xff0c;它允许你将应用及其依赖打包到一个可移植的容器中&#xff0c;然后可以在任何安装了Docker的机器上运行这个容器。Docker容器是跨平台的&#xff0c;但有一些限制和注意事项&#xff1a; 跨架构不可行 操作系统兼容性&#xff1a;Docke…...

Redis中的zset用法详解

文章目录 Redis中的zset用法详解一、引言二、zset的基本概念和操作1、zset的添加和删除1.1、添加元素1.2、删除元素 2、zset的查询2.1、获取元素分数2.2、获取元素排名 3、zset的范围查询3.1、按排名查询3.2、按分数查询 三、zset的应用场景1、排行榜1.1、添加玩家得分1.2、获取…...

上位机编程命名规范

1.大小写规范 文件名全部小写是一种广泛使用的命名约定&#xff0c;特别是在跨平台开发和开源项目中。主要原因涉及技术约束、可读性和一致性等方面。以下是原因和优劣势的详细分析&#xff1a; 1. 避免跨平台问题 不同操作系统对文件名的大小写处理方式不同&#xff1a; Li…...

Python 操作mysql - 关系型数据库存储

Python 操作mysql - 关系型数据库存储 文章目录 Python 操作mysql - 关系型数据库存储简单介绍连接数据库创建表插入数据更新数据删除数据查询数据 简单介绍 关系型数据库是一种以“关系”的方式来组织和存储数据的数据库。它使用表&#xff08;也称为“关系”&#xff09;来表…...

React基础知识一

写的东西太多了&#xff0c;照成csdn文档编辑器都开始卡顿了&#xff0c;所以分篇写。 1.安装React 需要安装下面三个包。 react:react核心包 react-dom:渲染需要用到的核心包 babel:将jsx语法转换成React代码的工具。&#xff08;没使用jsx可以不装&#xff09;1.1 在html中…...

游戏行业趋势:“AI、出海、IP”大热下,如何提升竞争力?

游戏&#xff1a;新品供给影响业绩释放节奏&#xff0c;后续游戏新品逐步上线&#xff0c;或驱动板块业绩修复 2024年前三季度A股游戏板块实现营业收入681.8亿元&#xff0c;同比增长5.1%&#xff0c;实现归母净利润73.3亿元&#xff0c;同比下滑30.4%&#xff0c;或主要受 20…...

shell--第一次作业

1.接收用户部署的服务名称 # 脚本入口 read -p "请输入要部署的服务名称&#xff1a;" service_name 2.判断服务是否安装 # 判断服务是否安装 if rpm -q "$service_name" &>/dev/null; then echo "服务 $service_name 已安装。" 已…...

Rust:原子操作 AtomicBool

在 Rust 中&#xff0c;你可以使用 std::sync::atomic 模块来进行原子操作。原子操作在多线程环境中特别有用&#xff0c;因为它们可以确保操作的原子性和可见性&#xff0c;从而避免数据竞争和其他并发问题。 为了读取和设置布尔值&#xff0c;你可以使用 AtomicBool 类型。以…...

深入浅出学算法002-n个1

任务内容 Description 由n个1组成的整数能被K&#xff08;K<10000)整除&#xff0c;n至少为多少&#xff1f; Input 多组测试数据&#xff0c;第一行输入整数T,表示组数 然后是T行&#xff0c;每行输入1个整 数代表K Output 对于每组测试数据输出1行&#xff0c;值为n Sampl…...

GPT1.0 和 GPT2.0 的联系与区别

随着自然语言处理技术的飞速发展&#xff0c;OpenAI 提出的 GPT 系列模型成为了生成式预训练模型的代表。作为 GPT 系列的两代代表&#xff0c;GPT-1 和 GPT-2 虽然在架构上有着继承关系&#xff0c;但在设计理念和性能上有显著的改进。本文将从模型架构、参数规模、训练数据和…...

STM32F103 GPIO和串口实战

本节我们将会对STM32F103的硬件资源GPIO和串口进行介绍。 一、GPIO 1.1 电路原理图 LED电路原理图如下图所示&#xff1a; 其中&#xff1a; LED1连接到PA8引脚&#xff0c;低电平点亮&#xff1b;LED2连接到PD2引脚&#xff0c;低电平点亮&#xff1b; 1.2 GPIO引脚介绍 STM32…...

2025届毕业生推荐的降重复率神器实测分析

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 于学术写作跟内容创作范畴之中&#xff0c;降重网站已然成了规避文本重复率过高的关键辅助工…...

超越序列:让AI以“面向对象”的方式理解与规划物理世界

从下一个token预测到下一个对象预测,我们如何重新思考AI生成与机器人控制 引言:大模型的“顺序陷阱” 在人工智能领域,以GPT为代表的大语言模型通过预测下一个token(文本片段)的方式,展现了令人惊叹的文本理解和生成能力。然而,这种自回归生成范式本质上是一种顺序处理…...

STM32驱动WS2812B做时钟?从5x5模块到4x1组合屏的实战避坑指南

STM32驱动WS2812B做时钟&#xff1a;从5x5模块到4x1组合屏的实战避坑指南 在创客圈子里&#xff0c;用WS2812B LED模块制作个性化时钟一直是个热门项目。这种可编程RGB LED以其简单的单线控制接口和丰富的色彩表现&#xff0c;成为DIY爱好者的心头好。但当你真正动手时&#x…...

企业数据存储频繁卡顿?该品牌SSD固态硬盘实测体验,揭秘稳定读写方案

在企业日常运营中&#xff0c;数据存储系统的频繁卡顿、读写延迟不仅影响工作效率&#xff0c;更可能成为业务连续性的潜在威胁。面对这一普遍痛点&#xff0c;许多企业开始寻求更可靠、更稳定的存储解决方案。本文将结合实测体验&#xff0c;探讨湖南天硕SSD固态硬盘如何凭借其…...

Kali虚拟机内存扩展实战:从Gparted操作到swap分区配置

1. Kali虚拟机内存扩展的必要性 很多刚开始玩Kali Linux虚拟机的朋友都会遇到一个头疼的问题——磁盘空间不够用。特别是当你在做渗透测试或者运行一些资源密集型工具时&#xff0c;系统突然提示"磁盘空间不足"&#xff0c;那种感觉就像开车时油箱突然见底一样让人焦…...

基于Python的充电桩时空供需动态解析:以深圳峰谷电价与节假日效应为例

1. 充电桩供需动态分析的技术背景 电动汽车充电桩的供需关系分析是城市智慧交通建设中的重要课题。作为一名长期从事数据分析工作的技术人&#xff0c;我发现在实际项目中&#xff0c;单纯统计充电桩数量远远不够&#xff0c;关键在于理解时空维度上的供需变化规律。深圳作为国…...

imx6ull静态IP配置与MobaXterm远程登录实战指南

1. imx6ull开发板静态IP配置全流程 第一次接触imx6ull开发板时&#xff0c;最让人头疼的就是每次重启后IP地址都会变化。想象一下&#xff0c;你刚调试好的远程连接&#xff0c;重启设备后就找不到了&#xff0c;这种体验实在太糟糕了。今天我就来分享一个彻底解决这个问题的方…...

TCT亚洲展|金属3D打印创新产品抢先看

本届TCT亚洲展有大量创新产品亮相&#xff0c;有的是概念产品&#xff0c;有的则已经被用于最终使用。本期内容&#xff0c;跟随3D打印技术参考&#xff0c;来探索部分创新应用。气液双向散热器概念设计这款产品由漫格科技与中科祥龙联合开发&#xff0c;是一件基于某真实项目的…...

用CodeBuddy在10分钟内搭建个人技术博客(含GitHub Pages部署教程)

用CodeBuddy在10分钟内搭建个人技术博客&#xff08;含GitHub Pages部署教程&#xff09; 在数字时代&#xff0c;拥有一个个人技术博客已成为开发者展示专业能力、分享技术见解的重要方式。本文将带你使用CodeBuddy这一智能编程助手&#xff0c;快速构建专业级技术博客&#x…...

终极指南:3步永久解密科学文库PDF文档,告别7天访问限制

终极指南&#xff1a;3步永久解密科学文库PDF文档&#xff0c;告别7天访问限制 【免费下载链接】ScienceDecrypting 破解CAJViewer带有效期的文档&#xff0c;支持破解科学文库、标准全文数据库下载的文档。无损破解&#xff0c;保留文字和目录&#xff0c;解除有效期限制。 …...