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

学习c#的第十四天

目录

C# 接口(Interface)

接口的特点

定义接口

接口继承

接口和抽象类的区别

C# 命名空间(Namespace)

using 关键字

定义命名空间

嵌套命名空间


C# 接口(Interface)

接口定义了所有类继承接口时应遵循的语法合同。接口定义了语法合同 "是什么" 部分,派生类定义了语法合同 "怎么做" 部分。

接口定义了属性、方法和事件,这些都是接口的成员。接口只包含了成员的声明。成员的定义是派生类的责任。接口提供了派生类应遵循的标准结构。

接口使得实现接口的类或结构在形式上保持一致。

抽象类在某种程度上与接口类似,但是,它们大多只是用在当只有少数方法由基类声明由派生类实现时。

接口本身并不实现任何功能,它只是和声明实现该接口的对象订立一个必须实现哪些行为的契约。

抽象类不能直接实例化,但允许派生出具体的,具有实际功能的类。

接口的特点

  1. 多重继承:通过接口可以实现多重继承,一个类可以实现多个接口。这使得接口在解决单继承语言中的多继承问题时非常有用。

  2. 无法直接实例化:接口不能被直接实例化,因为接口只定义了成员的签名,没有具体的实现。需要通过实现接口的类来创建对象。

  3. 成员的默认访问修饰符为public:接口中的成员默认为public,因为接口的目的是提供给外部使用。在C#中,不需要显式指定public修饰符。

  4. 成员不能有修饰符:接口中的成员(方法、属性、事件、索引器)不能有修饰符,如new、static、abstract、override、virtual等。

  5. 需要实现所有接口成员:如果一个类实现了一个接口,那么该类必须实现接口中定义的所有成员。否则,该类必须声明为抽象类。

  6. 接口成员可以被隐藏:当一个类实现多个接口时,如果多个接口中有相同的成员名称,可以使用关键字new来隐藏父接口中的成员。

  7. 接口可以包含属性:接口中可以定义属性,包括具有get和set访问器的自动属性。

总之,接口是一种定义了一组函数成员的引用类型,具有多重继承、无法直接实例化、必须实现所有成员等特点,通过实现接口可以为类提供共享的行为和功能。

定义接口

C# 中的接口(Interface)是一种抽象类型,它定义了对象应该具有的行为而不包含任何实际的实现。接口可以包含方法、属性、事件和索引器的声明,但不能包含字段或实例构造函数。

接口通过关键字 interface 进行声明,成员默认为公共的,并且不能包含访问修饰符。类可以实现一个或多个接口,并且接口之间可以进行多重继承。

下面是一个简单的接口示例:

using System;// 定义接口
public interface IShape
{void Draw();  // 方法声明string Name { get; set; }  // 属性声明
}// 实现接口
public class Circle : IShape
{public string Name { get; set; }  // 实现属性public void Draw()  // 实现方法{Console.WriteLine("正在绘制圆。。。");}
}public class Rectangle : IShape
{public string Name { get; set; }public void Draw(){Console.WriteLine("正在绘制矩形。。。");}
}class Program
{static void Main(){IShape shape1 = new Circle();shape1.Name = "Circle";shape1.Draw();  // 输出结果:正在绘制圆。。。IShape shape2 = new Rectangle();shape2.Name = "Rectangle";shape2.Draw();  // 输出结果:正在绘制矩形。。。}
}

在上述代码中,定义了一个 IShape 接口,其中包含一个方法 Draw 和一个属性 Name。然后,Circle 类和 Rectangle 类分别实现了 IShape 接口,并提供了对应的方法和属性的实现。在 Main 方法中,创建了 Circle 和 Rectangle 的实例,并分别赋值给 IShape 类型的变量,调用其方法和属性。

接口继承

在C#中,接口可以继承自一个或多个接口,这种机制被称为接口继承。通过接口继承,一个接口可以从一个或多个基接口中继承成员,从而构建更为灵活和复杂的接口体系。

下面是一个简单的接口继承示例:

using System;// 定义基础接口
public interface IShape
{void Draw();
}// 定义继承接口
public interface IResizableShape : IShape
{void Resize(int percentage);
}// 实现接口
public class Circle : IResizableShape
{public void Draw(){Console.WriteLine("正在绘制圆。。。");}public void Resize(int percentage){Console.WriteLine($"调整圆的大小为 {percentage}%");}
}class Program
{static void Main(){IResizableShape shape = new Circle();shape.Draw();   // 输出结果:正在绘制圆。。。shape.Resize(50);  // 输出结果:调整圆的大小为 50%}
}

在上述代码中,定义了一个基础接口 IShape,它包含了一个 Draw 方法。然后定义了一个继承接口 IResizableShape,它继承自 IShape 接口,并新增了一个 Resize 方法。最后,Circle 类实现了 IResizableShape 接口。

在 Main 方法中,创建了 Circle 的实例,并将其赋值给 IResizableShape 类型的变量,然后调用了其继承自基础接口和新增方法,可以看到接口继承可以让代码更加灵活和可扩展。

接口和抽象类的区别

接口和抽象类的主要区别如下:

  1. 继承关系:接口可以被多个类实现,而抽象类只能被单一类继承。

  2. 方法实现:接口只能声明方法、属性、事件和索引器,不包含方法的具体实现;而抽象类可以包含方法的实现。

  3. 多继承:由于单一继承的限制,使用抽象类时,如果要继承其他类,则只能通过接口来实现多重继承。

  4. 实例化:抽象类不能直接实例化,需要通过子类进行实例化;而接口本身不能实例化,需要通过实现接口的类来实例化。

  5. 修改影响:抽象类在增加新方法时,子类需要重新编译以实现新增的方法;而接口在增加新方法时,实现类需要手动实现新增的方法。

  6. 成员类型:接口中的成员默认为public(公共)的,而抽象类的成员可以有各种访问修饰符。

  7. 内容限制:接口中只能包含方法、属性、事件和索引器的声明,不包含字段、构造函数、析构函数、静态成员或常量;而抽象类可以包含这些成员。

还有一点,我们在VS中实现接口时会发现有2个选项,一个是实现接口,一个是显示实现接口。"实现接口"是常规的实现方式,实现的方法属于实现类的公共方法;而"显示实现接口"是一种特殊的实现方式,实现的方法不会作为实现类的公共方法,而是只能通过接口引用来调用。

C# 命名空间(Namespace)

命名空间的设计目的是提供一种让一组名称与其他名称分隔开的方式。在一个命名空间中声明的类的名称与另一个命名空间中声明的相同的类的名称不冲突。

我们举一个计算机系统中的例子,一个文件夹(目录)中可以包含多个文件夹,每个文件夹中不能有相同的文件名,但不同文件夹中的文件可以重名。

using 关键字

using的用法:

1、using 指令:引入命名空间 这是最常见的用法,通过 using 指令可以引入命名空间,使得在代码中可以直接使用该命名空间下的类型、类成员等。例如:

using System;
using Namespace1.SubNamespace;

上述代码中,我们引入了 System 命名空间和 Namespace1.SubNamespace 命名空间,这样就可以直接使用它们下面的类型和成员。

2、using static 指令:指定无需指定类型名称即可访问其静态成员的类型 using static 指令允许我们直接使用某个类型的静态成员,而无需指定类型名称。例如:

using static System.Math;
var value = PI; // 直接使用 System.Math.PI

上述代码中,我们使用 using static System.Math,这样就可以直接使用 Math 类的静态成员,如 PI,而无需写成 Math.PI。

3、起别名 有时候命名空间的名称可能很长,为了简化代码,可以为命名空间起一个别名。例如:

using Project = PC.MyCompany.Project;

上述代码中,我们将 PC.MyCompany.Project 命名空间起了一个别名 Project,这样在代码中就可以使用 Project 来代替 PC.MyCompany.Project。

4、using 语句:将实例与代码绑定 using 语句用于在代码段结束时,自动调用对象的 Dispose 方法,释放资源。例如:

using (Font font3 = new Font("Arial", 10.0f),font4 = new Font("Arial", 10.0f))
{// 使用 font3 和 font4
}

上述代码中,我们创建了两个 Font 对象,并将它们放在 using 语句中。当代码块执行完毕时,会自动调用 font3 和 font4 的 Dispose 方法来释放资源。

定义命名空间

 命名空间的定义是以关键字 namespace 开始,后跟命名空间的名称,如下所示:

namespace namespace_name
{// 代码声明
}

下面是一个简单的示例,展示了如何定义和使用命名空间:

using System;namespace MyNamespace
{class MyClass{public void MyMethod(){Console.WriteLine("这是我的类中的一个方法。");}}interface MyInterface{void MyMethod();}
}namespace AnotherNamespace
{class AnotherClass{public void AnotherMethod(){Console.WriteLine("这是另一个类中的一个方法。");}}
}

在上面的示例中,我们定义了两个命名空间:MyNamespace 和 AnotherNamespace。MyNamespace 中包含了一个名为 MyClass 的类和一个名为 MyInterface 的接口。AnotherNamespace 中包含了一个名为 AnotherClass 的类。

要在另一个代码文件中使用这些命名空间中的成员,可以按照以下方式进行引用:

using MyNamespace;
using AnotherNamespace;class Program
{static void Main(){MyClass myObject = new MyClass();myObject.MyMethod();  // 调用 MyNamespace 中的方法AnotherClass anotherObject = new AnotherClass();anotherObject.AnotherMethod();  // 调用 AnotherNamespace 中的方法}
}

在上述示例中,我们在 Program 类中通过 using 关键字引入了 MyNamespace 和 AnotherNamespace,然后可以直接使用这两个命名空间下的类和方法。

嵌套命名空间

在C#中,命名空间可以进行嵌套,即一个命名空间可以包含在另一个命名空间中。这种嵌套的结构可以用于更好地组织和管理代码,如下所示:

namespace namespace_name1 
{// 代码声明namespace namespace_name2 {// 代码声明}
}

下面是一个示例,展示了如何定义和使用嵌套命名空间:

using System;namespace OuterNamespace
{class OuterClass{public void OuterMethod(){Console.WriteLine("这是OuterClass中的一个方法。");}}namespace InnerNamespace{class InnerClass{public void InnerMethod(){Console.WriteLine("这是内部类中的一个方法。");}}}
}

在上面的示例中,我们定义了两个命名空间:OuterNamespace 和 InnerNamespace。InnerNamespace 嵌套在 OuterNamespace 中。

要在另一个代码文件中使用嵌套命名空间中的成员,可以按照以下方式进行引用:

using OuterNamespace;
using OuterNamespace.InnerNamespace;class Program
{static void Main(){OuterClass outerObject = new OuterClass();outerObject.OuterMethod();  // 调用 OuterNamespace 中的方法InnerClass innerObject = new InnerClass();innerObject.InnerMethod();  // 调用 InnerNamespace 中的方法}
}

在上述示例中,我们在 Program 类中通过 using 关键字引入了 OuterNamespace 和 OuterNamespace.InnerNamespace,然后可以直接使用这两个命名空间下的类和方法。

嵌套命名空间可以帮助我们更好地组织和管理代码,提高可读性和可维护性。

相关文章:

学习c#的第十四天

目录 C# 接口(Interface) 接口的特点 定义接口 接口继承 接口和抽象类的区别 C# 命名空间(Namespace) using 关键字 定义命名空间 嵌套命名空间 C# 接口(Interface) 接口定义了所有类继承接口时应…...

6.jvm中对象创建流程与内存分配

目录 概述对象的创建流程对象的内存分配方式对象怎样才会进入老年代大对象直接进入老年代内存担保 jvc 相关指令查看jdk默认使用的gc查看当前jdk支持的有哪些gc查看指定进程当前正在使用的gc 结束 概述 相关文章在此总结如下: 文章地址jvm基本知识地址jvm类加载系…...

算法--搜索与图

这里写目录标题 主要内容DFS思想 BFS思想 DFS与BFS的比较一级目录二级目录二级目录二级目录 一级目录二级目录二级目录二级目录 一级目录二级目录二级目录二级目录 主要内容 DFS 思想 会优先向深处搜索 一旦到达最深处 那么会回溯 但是在回溯的过程中 会边回溯边观察是否有能继…...

ROS 文件系统

ROS文件系统级指的是在硬盘上ROS源代码的组织形式,ROS 的文件系统本质上都还是操作系统文件,可以使用Linux命令来操作这些文件,文件操作,包含增删改查与执行等操作,ROS文件系统的一些常用命令如下: 1.增加…...

车载通信与DDS标准解读系列(1):DDS-RPC

▎RPC & DDS-RPC RPC:Remote Procedure Call,远程过程调用。 远程过程调用是一种进程间通信,它允许计算机程序在另一个地址空间中执行子程序,就好像用别人的东西像用自己的一样,常用于分布式系统。 远程过程调用…...

通过构造树形结构介绍map的用法

构造TreeSelect树形结构&#xff1a; 当我们拿到的数据与我们要用的数据不一致时&#xff0c;就要改造成自己想要的数据结构。 后端拿到的数据结构&#xff1a; public class TPMGroup{public string DepName { get; set; }public List<staff> TPMList { get; set; }pu…...

代码随想录算法训练营Day 53 || 1143.最长公共子序列、1035.不相交的线、53. 最大子序和

1143.最长公共子序列 力扣题目链接 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长公共子序列的长度。 一个字符串的 子序列 是指这样一个新的字符串&#xff1a;它是由原字符串在不改变字符的相对顺序的情况下删除某些字符&#xff08;也可以不删除任何…...

Oracle JDBC数据库驱动程序介绍

Maven Central上所有Oracle JDBC数据库驱动程序 现在不仅可以在Maven Central上使用甲骨文数据库最新版本&#xff0c;而且还可以获得所有受支持的Oracle JDBC驱动程序发行版&#xff0c;包括19.3.0.0、18.3.0.0、12.2.0.1和11.2.0.4。从现在开始&#xff0c;Maven Central确实…...

scipy实现单因素方差分析

经典例题 某校高二年级共有四个班&#xff0c;采用四种不同的教学方法进行数学教学&#xff0c;为了比较这四种教学法的效果是否存在明显的差异&#xff0c;期末统考后&#xff0c;从这四个班中各抽取 5 名考生的成绩&#xff0c;如下所示。 班级 一班 二班 三班 四班 …...

深度学习实战59-NLP最核心的模型:transformer的搭建与训练过程详解,手把手搭建与跑通

大家好,我是微学AI,今天给大家介绍一下深度学习实战59-NLP最核心的模型:transformer的搭建与训练过程详解,手把手搭建与跑通。transformer是一种基于自注意力机制的深度学习模型,由Vaswani等人在2017年的论文《Attention is All You Need》中提出。它最初被设计用来处理序…...

一阶滤波器(一阶巴特沃斯滤波器)

连续传递函数G(s) 离散传递函数G(z) 转换为差分方程形式 一阶巴特沃斯滤波器Filter Designer参数设计&#xff1a;参考之前的博客Matlab的Filter Designer工具设计二阶低通滤波器 设计采样频率100Hz&#xff0c;截止频率20Hz。 注意&#xff1a;设计参数使用在离散系统中&…...

.net core中前端vue HTML5 History 刷新页面404问题

放到启动的应用程序的最后面 app.Run(async (context) > {context.Response.ContentType "text/html";await context.Response.SendFileAsync(Path.Combine(env.WebRootPath, "index.html")); });https://blog.csdn.net/lee576/article/details/88355…...

【152.乘积最大子数组】

目录 一、题目描述二、算法原理三、代码实现 一、题目描述 二、算法原理 三、代码实现 class Solution { public:int maxProduct(vector<int>& nums) {int nnums.size();vector<int> f(n);vector<int> g(n);f[0]g[0]nums[0];int retnums[0];for(int i1;…...

如何开发OA系统场景的系统架构

1.开发OA系统场景的系统架构 针对开发OA系统的场景&#xff0c;以下是一个简单的系统架构示例&#xff0c;包括前端、后端和数据库三个基本部分&#xff1a; 前端&#xff1a; 使用React框架进行前端开发&#xff0c;构建用户界面和交互逻辑。前端模块包括日程管理模块、文档管…...

spring boot 集成 RedisSearch 和 RedisJSON

1. 准备工作 环境说明 java 8&#xff1b;redis7.2.2&#xff0c;redis集成RedisSearch、redisJson 模块&#xff1b;spring boot 2.5在执行 redis 命令&#xff0c; 或者监控 程序执行的redis 指令时&#xff0c;可以采用 redisinsight查看&#xff0c;下载地址。 背景说明 需…...

【Kotlin精简】第8章 协程

1 简介 Kotlin 中的协程提供了一种全新处理并发的方式&#xff0c;您可以在 Android 平台上使用它来简化异步执行的代码。协程是从 Kotlin 1.3 版本开始引入&#xff0c;但这一概念在编程世界诞生的黎明之际就有了&#xff0c;最早使用协程的编程语言可以追溯到 1967 年的 Sim…...

【MATLAB源码-第79期】基于蚯蚓优化算法(EOA)的栅格路径规划,输出做短路径图和适应度曲线。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 蚯蚓优化算法&#xff08;Earthworm Optimisation Algorithm, EOA&#xff09;是一种启发式算法&#xff0c;灵感来源于蚯蚓在自然界中的行为模式。蚯蚓优化算法主要模仿了蚯蚓在寻找食物和逃避天敌时的行为策略。以下是蚯蚓…...

RPC实现简单解析

RPC是什么&#xff0c;先摘取一段解释&#xff1a; RPC全称为远程过程调用&#xff08;Remote Procedure Call&#xff09;&#xff0c;它是一种计算机通信协议&#xff0c;允许一个计算机程序调用另一个计算机上的子程序&#xff0c;而无需了解底层网络细节。通过RPC&#xff…...

【Ubuntu】Ubuntu20.04下安装视频播放器vlc和录屏软件ssr

【Ubuntu】Ubuntu20.04下安装视频播放器vlc和录屏软件ssr 文章目录 【Ubuntu】Ubuntu20.04下安装视频播放器vlc和录屏软件ssr1. 安装视频播放器vlc2. 安装录屏软件ssr 1. 安装视频播放器vlc sudo apt-get install vlcvlc是一款比较简洁的视频播放器&#xff0c;如下所示 2. 安…...

WMS仓储管理系统与TMS系统整合后的优势

随着全球化的加速和供应链网络的日益复杂&#xff0c;仓库和运输成为企业运营中的两个关键环节。为了更高效地管理这两个环节&#xff0c;许多企业开始探索将WMS仓储管理系统和TMS运输管理系统整合的可能性。这种整合不仅可以提升仓库流程的可见性&#xff0c;还有助于改善调度…...

<6>-MySQL表的增删查改

目录 一&#xff0c;create&#xff08;创建表&#xff09; 二&#xff0c;retrieve&#xff08;查询表&#xff09; 1&#xff0c;select列 2&#xff0c;where条件 三&#xff0c;update&#xff08;更新表&#xff09; 四&#xff0c;delete&#xff08;删除表&#xf…...

《基于Apache Flink的流处理》笔记

思维导图 1-3 章 4-7章 8-11 章 参考资料 源码&#xff1a; https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...

大学生职业发展与就业创业指导教学评价

这里是引用 作为软工2203/2204班的学生&#xff0c;我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要&#xff0c;而您认真负责的教学态度&#xff0c;让课程的每一部分都充满了实用价值。 尤其让我…...

MySQL 知识小结(一)

一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库&#xff0c;分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷&#xff0c;但是文件存放起来数据比较冗余&#xff0c;用二进制能够更好管理咱们M…...

Vite中定义@软链接

在webpack中可以直接通过符号表示src路径&#xff0c;但是vite中默认不可以。 如何实现&#xff1a; vite中提供了resolve.alias&#xff1a;通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...

在树莓派上添加音频输入设备的几种方法

在树莓派上添加音频输入设备可以通过以下步骤完成&#xff0c;具体方法取决于设备类型&#xff08;如USB麦克风、3.5mm接口麦克风或HDMI音频输入&#xff09;。以下是详细指南&#xff1a; 1. 连接音频输入设备 USB麦克风/声卡&#xff1a;直接插入树莓派的USB接口。3.5mm麦克…...

sshd代码修改banner

sshd服务连接之后会收到字符串&#xff1a; SSH-2.0-OpenSSH_9.5 容易被hacker识别此服务为sshd服务。 是否可以通过修改此banner达到让人无法识别此服务的目的呢&#xff1f; 不能。因为这是写的SSH的协议中的。 也就是协议规定了banner必须这么写。 SSH- 开头&#xff0c…...

针对药品仓库的效期管理问题,如何利用WMS系统“破局”

案例&#xff1a; 某医药分销企业&#xff0c;主要经营各类药品的批发与零售。由于药品的特殊性&#xff0c;效期管理至关重要&#xff0c;但该企业一直面临效期问题的困扰。在未使用WMS系统之前&#xff0c;其药品入库、存储、出库等环节的效期管理主要依赖人工记录与检查。库…...

【实施指南】Android客户端HTTPS双向认证实施指南

&#x1f510; 一、所需准备材料 证书文件&#xff08;6类核心文件&#xff09; 类型 格式 作用 Android端要求 CA根证书 .crt/.pem 验证服务器/客户端证书合法性 需预置到Android信任库 服务器证书 .crt 服务器身份证明 客户端需持有以验证服务器 客户端证书 .crt 客户端身份…...

算法刷题-回溯

今天给大家分享的还是一道关于dfs回溯的问题&#xff0c;对于这类问题大家还是要多刷和总结&#xff0c;总体难度还是偏大。 对于回溯问题有几个关键点&#xff1a; 1.首先对于这类回溯可以节点可以随机选择的问题&#xff0c;要做mian函数中循环调用dfs&#xff08;i&#x…...