【C#】接口定义和使用知多少

给自己一个目标,然后坚持一段时间,总会有收获和感悟!
最近在封装和参考sdk时,看到一个不错的写法,并且打破自己对接口和实现类固定的观念,这也充分说明自己理解掌握的知识点还不够深。

在这里插入图片描述

目录

  • 前言
  • 一、什么是接口
    • 1.1、规范
    • 1.2、多态性
  • 二、使用场景
    • 2.1、实现多态性
    • 2.2、插件式开发
    • 2.3、依赖注入
    • 2.4、面向接口编程
    • 2.5、合同与契约
  • 三、简单举例
    • 3.1、全继承
    • 3.2、部分继承
  • 四、如何提高
    • 4.1、多练习
    • 4.2、阅读和理解源码
    • 4.3、学习算法和数据结构
    • 4.4、使用工具
    • 4.5、参与社区
    • 4.6、持续学习

前言

在自己的固有的观念里,接口类所定义的成员,实现类在继承接口类后,一定都是要实现的。
其实也没有错,但是还会有变通的写法,比如继承一个定义了100个方法的接口,A部分类继承实现10个接口,B部分类继承实现20个接口,C部分类继承实现剩余的70个,这样的写法可以很清晰的按功能模块进行文件命名,而接口类只需要一个即可,方便维护。

总结:如何才能从中级进阶到高级开发水平,那么灵活变通的思维就是一个很好的判断条件之一,当然也可以说是一个经验积累所支撑。
缺乏时间进行深度思考(可能也是因为所处环境影响或者自身自律不够,导致没有太多时间进行自我深度思考和实践验证)

一、什么是接口

1.1、规范

在 C# 中,接口(Interface)是一种定义规范,而不是定义行为的类型。接口定义了一个对象或者类要实现的操作,它可以定义一组方法、属性、索引器和事件。
在 C# 中,我们使用 interface 关键字来定义一个接口。接口定义中只包含属性和方法的签名,而没有实际的方法实现或字段。可以把一个接口看做是一组公共的属性和方法的规范。
以下是一个简单的接口定义的例子:

interface ILogger
{void Log(string message);string Name { get; set; }
}

在上面的例子中,ILogger 接口定义了一个 Log() 方法和一个 Name 属性。任何实现 ILogger 接口的类都必须实现这两个成员。

1.2、多态性

接口的主要作用是为多态性提供支持。多态性是面向对象编程的一个核心概念,它允许我们使用一个对象的接口,而不需要了解对象的实际类型。当一个对象实现了一个接口,它就可以用作该接口类型的实例,从而实现多态性调用。
例如,假设我们有一个 ILogger 接口和一个 FileLogger 类,它实现了该接口:

class FileLogger : ILogger
{public void Log(string message){// 将message记录到文件中}public string Name { get; set; }
}

我们可以创建一个 ILogger 类型的变量,并将它设置为一个 FileLogger 类型的实例:

ILogger logger = new FileLogger();
logger.Log("Hello, world!");

在上面的例子中,变量 logger 的类型是 ILogger,它实际上持有一个 FileLogger 类型的实例。
我们可以使用 ILogger 类型的 logger 变量来调用 Log() 方法,即使我们不知道它实际上是一个 FileLogger 对象。
这就是多态性调用的概念,它是通过接口来实现的。

总的来说,接口是一个规范,定义了一个对象或者类所必须实现的操作。接口对于实现多态性调用和组件重用都极为有用。

二、使用场景

接口在 C# 中有许多常见的使用场景

2.1、实现多态性

接口是实现多态性的核心机制之一。通过使用接口,可以在不知道对象的具体类型的情况下,调用其实际类型的方法。这使得代码更加灵活和可扩展。接口常用于定义公共的操作,例如数据库访问接口、日志记录接口等。

2.2、插件式开发

接口在插件式开发中使用广泛。通过定义插件接口,可以为应用程序提供一种可扩展的方式,使得开发者可以编写自己的插件,并通过实现接口与应用程序进行交互。

2.3、依赖注入

接口在依赖注入(Dependency Injection)模式中发挥重要作用。通过将接口作为依赖的类型,可以实现松散耦合的设计,并支持替换特定实现的能力。这使得代码更具灵活性、可测试性和可维护性。

2.4、面向接口编程

面向接口编程是一种设计原则,强调编写代码时应关注接口而不是具体实现。这种方式使得代码更加灵活、可替换和可测试。通过编写接口,可以定义所需的功能和约定,并确保代码遵循这些约定。

2.5、合同与契约

接口可以用作合同和契约的定义。在设计类、库或服务时,接口定义了所需要的方法和成员,以及它们的预期行为。这样,其他开发人员在使用你的代码时,可以遵循这些接口,以确保他们的代码与你的代码正确地交互。

这只是一些常见的使用场景,实际上接口在开发中的应用非常广泛。
接口提供了一种定义和实现规范的机制,可以增强代码的可扩展性、可维护性和可测试性。
通过合理地使用接口,可以使代码更加灵活、可插拔,并促进良好的设计和组织。

三、简单举例

3.1、全继承

在定义和继承接口时,经常会看到如下错误提示,MyClass不实现接口成员IBase.One()。
意思就是当前实现类未对接口定义的方法进行实现。通常这样继承接口的实现类,接口定义了多少个方法就要实现多少个。

  • 错误写法

  • 正确写法

public interface IBase
{string One();string Two();string Thre();
}public class MyClass : IBase
{public string One(){return "one";}public string Two(){return "two";}public string Thre(){return "three";}
}

3.2、部分继承

这里指的部分是指分开多个部分类继承实现,分开的类合起来实现的方法就是接口类定义好的方法

  • 错误写法

  • 正确写法

public interface IBase
{string One();string Two();string Thre();
}partial class MyClassNew : IBase
{}partial class MyClassNew
{public string One(){return "One";}}partial class MyClassNew
{public string Two(){return "Two";}}partial class MyClassNew
{public string Thre(){return "Thre";}}

虽然类名是一样,但是文件名可以命名不同的功能模块名称,比如

MyClassNew > partial class MyClassNew:IBase
UserClass > partial class MyClassNew
LogClass > partial class MyClassNew
ProductClass > partial class MyClassNew

四、如何提高

如何提高编码水平,我觉得如下几点建议可以参考下,不管你是否有无天赋或者编程优势,都可以从以下几点建议得到提升。

4.1、多练习

编码水平的提高需要通过不断地实践和尝试来进行。写更多的代码并解决实际问题,可以帮助你积累经验和知识,并提高编码水平。

4.2、阅读和理解源码

学习其他人的代码,可以帮助你了解新的编程技术和代码组织方式。通过阅读别人的代码,你可以了解到更好的实现方式和常见的设计模式,这有助于提高你的编码技巧。

4.3、学习算法和数据结构

算法和数据结构是编程的基础。学习和掌握算法和数据结构,可以使你更加深入地理解编程的本质,并能够更有效地解决问题。

4.4、使用工具

使用强大的编辑器和调试器可以提高编码效率和准确性。学习和使用脚本工具、自动化测试工具、代码重构工具和其他有助于优化开发流程的工具,可以帮助你更加专注于代码的核心功能。

4.5、参与社区

比如:csdn就是很好的学习平台,在平台上可以学习到很多技术知识以及认识都多优秀的小伙伴。
参与开源项目、博客、论坛和其他在线社区可以帮助你与其他开发人员互动,学习新技术和解决问题。与他人分享自己的代码和技能,可以促进合作和学习。

4.6、持续学习

编程技术和工具不断发展和改进,因此持续学习非常重要。阅读最新的文档、参加课程和工作坊、参加会议和活动、关注技术博客和新闻,这些都是学习新知识和保持学习动力的途径。

提高编码水平需要不断的实践、学习和尝试。相信每位小伙伴都能成为一名优秀开发者,并能够创造出更好、更高效的代码。

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

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

相关文章

Kubernetes(K8s)_16_CSI

Kubernetes(K8s)_16_CSI CSICSI实现CSI接口CSI插件 CSI CSI(Container Storage Interface): 实现容器存储的规范 本质: Dynamic Provisioning、Attach/Detach、Mount/Unmount等功能的抽象CSI功能通过3个gRPC暴露服务: IdentityServer、ControllerServe…

C++二维数组名到底代表个啥

题目先导 int a[3][4]; 则对数组元素a[i][j]正确的引用是*(*(ai)j)先翻译一下这个*(*(ai)j),即a后移i解引用,再后移j再解引用,这么看来a就应该是个二维数组,第一层存储行向量,一次解引用获得行向量的地址,…

LLM推理部署(三):一个强大的LLM生态系统GPT4All

GPT4All,这是一个开放源代码的软件生态系,它让每一个人都可以在常规硬件上训练并运行强大且个性化的大型语言模型(LLM)。Nomic AI是此开源生态系的守护者,他们致力于监控所有贡献,以确保质量、安全和可持续…

听GPT 讲Rust源代码--src/tools(6)

File: rust/src/tools/rust-analyzer/crates/ide/src/references.rs 在Rust源代码中,references.rs文件位于rust-analyzer工具的ide模块中,其作用是实现了用于搜索引用的功能。 该文件包含了多个重要的结构体、特质和枚举类型,我将逐一介绍它…

node.js-连接SQLserver数据库

1.在自己的项目JS文件夹中建文件:config.js、mssql.js和server.js以及api文件夹下的user.js 2.在config.js中封装数据库信息 let app {user: sa, //这里写你的数据库的用户名password: ,//这里写数据库的密码server: localhost,database: medicineSystem, // 数据…

OpenSSH 漏洞修复升级最新版本

Centos7系统ssh默认版本一般是OpenSSH7.4左右,低版本是有漏洞的而且是高危漏洞,在软件交付和安全扫描上是过不了关的,一般情况需要升级OpenSSH的最新版本 今天详细说下升级最新版本的处理过程(认真看会发现操作很简单&#xff0c…

Best Rational Approximation ——二分

许多微控制器没有浮点单元,但确实有一个(合理)快速整数除法单元。在这些情况下,使用有理值来近似浮点常数可能是值得的. 例如,355/113 3.1415929203539823008849557522124 是 π 3.14159265358979323846 一个很好的近…

【教学类-06-12】20231202 0-9数字分合-房屋样式(一)-下右空-升序-抽7题

作品展示-屋顶分合(0-9之间随机抽取7个不重复分合) 背景需求: 大班幼儿学分合题,通常区角里会设计一个“房屋分合”的样式 根据这种房屋样式,设计0-9内的升序分合题模板 素材准备 WORD样式 代码展示: 2-9…

PlantUML语法(全)及使用教程-用例图

目录 1. 用例图1.1、什么是用例图1.2、用例图的构成1.3、参与者1.4、用例1.4.1、用例基本概念1.4.2、用例的识别1.4.3、用例的要点1.4.3、用例的命名1.4.4、用例的粒度 1.5、应用示例1.5.1、用例1.5.2、角色1.5.3、改变角色的样式1.5.4、用例描述1.5.5、改变箭头方向1.5.6、使用…

AI创作ChatGPT源码+AI绘画(Midjourney绘画)+DALL-E3文生图+思维导图生成

一、AI创作系统 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统,支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美,可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI…

C语言——指针(四)

📝前言: 上篇文章C语言——指针(三)对指针和数组进行了讲解,今天主要更深入的讲解一下不同类型指针变量的特点: 1,字符指针变量 2,数组指针变量 3,函数指针变量 &#x1…

Spring boot命令执行 (CVE-2022-22947)漏洞复现和相关利用工具

Spring boot命令执行 (CVE-2022-22947)漏洞复现和相关利用工具 名称: spring 命令执行 (CVE-2022-22947) 描述: Spring Cloud Gateway是Spring中的一个API网关。其3.1.0及3.0.6版本(包含)以前存在一处SpEL表达式注入漏洞,当攻击者可以访问A…

2022年8月2日 Go生态洞察:Go 1.19版本发布深度解析

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

6-63.圆类的定义与使用(拷贝构造函数)

本题要求完成一个圆类的定义,设计适当的函数:包括构造函数、拷贝构造函数以及析构函数,从而可以通过测试程序输出样例 在这里给出一组输入。例如: 5 输出样例: 在这里给出相应的输出。例如: Constructo…

本项目基于Spring boot的AMQP模块,整合流行的开源消息队列中间件rabbitMQ,实现一个向rabbitMQ

在业务逻辑的异步处理,系统解耦,分布式通信以及控制高并发的场景下,消息队列有着广泛的应用。本项目基于Spring的AMQP模块,整合流行的开源消息队列中间件rabbitMQ,实现一个向rabbitMQ添加和读取消息的功能。并比较了两种模式&…

osg LOD节点动态调度

1、LOD节点 LOD(level of detail):是指根据物体模型的结点在显示环境中所处的位置和重要度,决定物体渲染的资源分配,降低非重要物体的面数和细节度,从而获得高效率的渲染运算。在OSG的场景结点组织结构中&…

mongoose学习记录

mongoose安装和连接数据库 npm i mongoose导入mongoose const mongoose require(mongoose) mongoose.set("strictQuery",true)连接数据库 mongoose.connect(mongodb:127.0.0.1:27017/test)设置回调 mongoose.connection.on(open,()>{console.log("连接成…

规则引擎专题---3、Drools组成和入门

Drools概述 drools是一款由JBoss组织提供的基于Java语言开发的开源规则引擎,可以将复杂且多变的业务规则从硬编码中解放出来,以规则脚本的形式存放在文件或特定的存储介质中(例如存放在数据库中),使得业务规则的变更不需要修改项目代码、重启…

numpy实现神经网络

numpy实现神经网络 首先讲述的是神经网络的参数初始化与训练步骤 随机初始化 任何优化算法都需要一些初始的参数。到目前为止我们都是初始所有参数为0,这样的初始方法对于逻辑回归来说是可行的,但是对于神经网络来说是不可行的。如果我们令所有的初始…

手写VUE后台管理系统7 - 整合Less样式

整合LESS 安装使用 Less(Leaner Style Sheets),是一门向后兼容的 CSS 扩展语言。 Less 官网:https://less.bootcss.com/ 安装 yarn add less安装完成就可以直接使用了 使用 以文件形式定义全局样式 在 assets 目录下创建 less …