学习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,然后可以直接使用这两个命名空间下的类和方法。

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

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

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

相关文章

01ctfer 文件上传

01ctfer 文件上传 启动靶场 访问该地址 代码审计 <?php header("Content-Type:text/html; charsetutf-8"); // 每5分钟会清除一次目录下上传的文件 require_once(pclzip.lib.php);if(!$_FILES){echo <!DOCTYPE html> <html lang"zh">…

设计模式-备忘录模式-笔记

动机&#xff08;Motivation&#xff09; 在软件构建过程中&#xff0c;某些对象的状态在转换过程中&#xff0c;可能由于某种需要&#xff0c;要求程序能够回溯到对象之前处于某个点时的状态。如果使用一些公有接口来让其他对象得到对象的状态&#xff0c;便会暴露对象的细节…

FPGA模块——IIC协议(FPGA做主机操作24C64)

FPGA模块——IIC协议&#xff08;FPGA做主机操作24C64&#xff09; EEPROM&#xff08;24C64&#xff09;向器件写数据时序向器件读数据时序 IIC协议FPGA主机代码IIC读寄存器驱动&#xff08;指定地址单次读写&#xff09;使用 IIC模块 EEPROM&#xff08;24C64&#xff09; 掉…

如何解决网页中的pdf文件无法下载?pdf打印显示空白怎么办?

问题描述 偶然间&#xff0c;遇到这样一个问题&#xff0c;一个网页上的附件pdf想要下载打印下来&#xff0c;奈何尝试多种办法都不能将其下载下载&#xff0c;点击打印出现的也是一片空白 百度搜索了一些解决方案都不太行&#xff0c;主要解决方案如&#xff1a;https://zh…

Python in Visual Studio Code 2023年11月发布

排版&#xff1a;Alan Wang 我们很高兴地宣布 Visual Studio Code 的 Python 和 Jupyter 扩展将于 2023 年 11 月发布&#xff01; 此版本包括以下公告&#xff1a; 改进了使用 Shift Enter 在终端中运行当前行弃用内置 linting 和格式设置功能对 Python linting 扩展的改进重…

window 搭建 MQTT 服务器并使用

1. 下载 安装 mosquitto 下载地址&#xff1a; http://mosquitto.org/files/binary/ win 使用 win32 看自己电脑下载相应版本&#xff1a; 一直安装&#xff1a; 记住安装路径&#xff1a;C:\Program Files\mosquitto 修改配置文件&#xff1a; allow_anonymous false 设置…

金融行业如何数字化转型?_光点科技

金融行业的数字化转型涉及技术创新的引入、客户体验的改善、内部流程的优化、安全和合规性的加强以及员工技能和企业文化的转变。 技术创新 包括云计算、人工智能、大数据分析和区块链技术的采用。云计算增强数据处理的灵活性&#xff0c;AI和机器学习在风险评估和欺诈检测方面…

Linux环境下安装部署MySQL8.0以上(内置保姆级教程)- 离线模式

摘要 本文档适用于在无网的情况下手动部署的MySQL。任何版本均可按照如下步骤进行部MySQL。 并且还讲解了如何修改数据库root账号的密码&#xff1b;以及还讲解了如何开启mysql远程访问权限&#xff0c;允许远程连接。 一、安装前准备工作 1.确认目前服务器上是否存在MySQL…

关于数据mysql ->maxwell->kafka的数据传输

个人名片&#xff1a; &#x1f405;作者简介&#xff1a;一名大三在校生&#xff0c;热爱生活&#xff0c;爱好敲码&#xff01; \ &#x1f485;个人主页 &#x1f947;&#xff1a;holy-wangle ➡系列内容&#xff1a; &#x1f5bc;️ tkinter前端窗口界面创建与优化 &…

ZYNQ_project:test_fifo_255X8

首先&#xff0c;这个vivado的fifo和quartus有很大不同。 用BRAM来实现异步fifo。 vivado的fifo有复位&#xff0c;在时钟信号稳定后&#xff0c;复位至少三个时钟周期&#xff08;读写端口的慢时钟&#xff09;&#xff0c;复位完成后30个时钟周期后再进行写操作&#xff08…

微信小程序渲染的富文本里面除了img标签外什么都没有,该如何设置img的大小

微信小程序富文本渲染&#xff1a; <rich-text nodes"{{content}}"style"{{style}}" ></rich-text> content是接口得到的值 let cont object.contentlet a cont.replace(/<img/gi,<img style"max-width:94%;height:auto;margi…

python环境安装教程

1.python解释器安装 python解释器&#xff1a;将书写的代码转换为二进制。 1.打开官网&#xff1a;Welcome to Python.org&#xff0c;点击下载&#xff0c;选择对应的系统和想要下载的python版本进行下载&#xff1a; 2.双击打开下载好的python解释器进行安装&#xff0c;可…

Android 摇一摇功能实现,重力加速度大于15

最近接到需求实现摇一摇需求&#xff0c;不过这个法律限制的很严格&#xff0c;属于敏感地带&#xff0c;实现后又被叫停了。 法律要求&#xff1a; 如果按照规定&#xff0c;操作时间不少于3s就基本没什么跳转了。 实现的话&#xff0c;只考虑了第一条&#xff0c;即&#…

CTFd-Web题目动态flag

CTFd-Web题目动态flag 1. dockerhub注册2. dockerfile编写3. 上传到docker仓库4. 靶场配置5. 动态flag实现 1. dockerhub注册 想要把我们的web题目容器上传到docker仓库中&#xff0c;我们需要dockerhub官网注册一个账号&#xff0c;网址如下 https://hub.docker.com/2. dock…

redis运维(六)redis-cli命令

一 redis-cli 注意&#xff1a; redis-cli核redis-server版本必须适配 --> 见 redis-cli --version提示&#xff1a; 不过一般安装服务端 redis-server 时内置了客户端 redis-cli说明&#xff1a; redis-cli 是 redis 的一种命令行的客户端工具备注&#xff1a; redis-se…

Android 13.0 recovery出厂时清理中字体大小的修改

1.前言 在13.0的系统rom定制化开发中,在recovery模块也是系统中比较重要的模块,比如恢复出厂设置,recovery ota升级, 清理缓存等等,在一些1080p的设备,但是density只是240这样的设备,会在恢复出厂设置的时候,显示的字体有点小, 产品要求需要将正在清理的字体调大点,这…

APP安全加固怎么做?加固技术、加固方法、加固方案

​ 前面的文章中我们为大家介绍了移动应用安全检测的测试依据、测试方法、和测试内容&#xff0c;本文我们着重分享App安全加固的相关内容。 ​ &#xff08;安全检测内容&#xff09; 通过前面的文章我们知道了app安全检测要去检测哪些内容&#xff0c;发现问题后我们如何去修…

mysql中的各种日志文件redo log、undo log和binlog

mysql中的各种日志文件redo log、undo log和binlog mysql中的各种日志文件redo log、undo log和binlog1.MySQL日志文件类型2.redo log日志2.1 作用2.2工作原理&#xff1a;2.3详解 3.undo log日志4.binlog日志5.总结 mysql中的各种日志文件redo log、undo log和binlog 1.MySQL…

常见排序算法实现

&#x1f495;"每一天都是值得被热爱的"&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容&#xff1a;常见排序算法实现 1.排序的概念 所谓排序&#xff0c;就是按照特定顺序重新排列序列的操作 排序的稳定性&#xff1a; 当一个序列中存在相同的元素时 排序过…

R语言绘制精美图形 | 火山图 | 学习笔记

一边学习&#xff0c;一边总结&#xff0c;一边分享&#xff01; 教程图形 前言 最近的事情较多&#xff0c;教程更新实在是跟不上&#xff0c;主要原因是自己没有太多时间来学习和整理相关的内容。一般在下半年基本都是非常忙&#xff0c;所有一个人的精力和时间有限&#x…