学习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.mfbz.cn/a/161720.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

036、目标检测-锚框

之——对边缘框的简化 目录 之——对边缘框的简化 杂谈 正文 1.锚框操作 2.IoU交并比 3.锚框标号 4.非极大值抑制 5.实现 拓展 杂谈 边缘框这样一个指定roi区域的操作对卷积神经网络实际上是很不友好的,这可能会对网络感受野提出一些特定的要求&#xff0…

HUAWEI华为笔记本MateBook X 2021款i5集显(EULD-WFH9,WXX9)原装出厂Windows11系统工厂模式包

下载链接:https://pan.baidu.com/s/1gQ_O203SSm83Nc-zDk1iNA?pwd4exz 提取码:4exz 系统带F10一键智能还原功能隐藏恢复分区、所有驱动、Office办公软件、华为电脑管家等预装程序 所需要工具:32G或以上的U盘 文件格式:zip …

智慧工地APP全套源码,智慧工地云平台

智慧工地平台 ,智慧工地源码,智慧工地APP全套源码 智慧工地以施工现场风险预知和联动预控为目标,将智能AI、传感技术、人像识别、监控、虚拟现实、物联网、5G、大数据、互联网等新一代科技信息技术植入到建筑、机械、人员穿戴设施、场地进出关…

Linux下查看pytorch运行时真正调用的cuda版本

一般情况我们会安装使用多个cuda版本。而且pytorch在安装时也会自动安装一个对应的版本。 正确查看方式: 想要查看 Pytorch 实际使用的运行时的 cuda 目录,可以直接输出 cpp_extension.py 中的 CUDA_HOME 变量。 import torch import torch.utils imp…

Nginx反向代理和负载均衡

1.反向代理 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一…

springboot+vue+element简单实现教学课程申报管理系统

目录 一、项目预览 二、项目效果图及说明 1.项目说明 1.登录 2.欢迎页 3.教师管理 4.课程申报 ​5.管理员管理 三、代码实现 1.后端项目结构图 2.数据库表脚本 3.路由配置 四、总结 一、项目预览 在线预览:点击访问其他项目访问:点击访问后端实…

Java学习之路 —— Java高级

文章目录 前言1. 单元测试2. 反射2.1 获取Class对象的三种方式2.2 获取类的构造器的方法2.3 获取类的成员变量2.4 获取类的成员方法2.5 反射的作用 3. 注解3.1 自定义注解3.2 注解的原理3.3 元注解3.4 注解的解析 4. 动态代理5. 总结 前言 终于走到新手村的末端了,…

青少年CTF-WEB-Flag在哪里?

题目环境:F12查看源代码得到flag:qsnctf{1167716c-54f0-47da-baed-49e3b08dfaeb} 此题主要考察F12查看源代码的使用

java.net.UnknownHostException: eureka

java.net.UnknownHostException: eureka 哦。HOST漏了 #linux /etc/hosts #windows C:\Windows\System32\drivers\etc\hosts 127.0.0.1 eureka7000 127.0.0.1 eureka7001 127.0.0.1 eureka7002

MATLAB画图分辨率、图像大小研究

MATLAB画图分辨率、图像大小研究 Figure属性中 InnerPosition Position OuterPosition区别画图与打印的分辨率和图像大小研究首先明确两个概念:MATLAB实操画图 Figure属性中 InnerPosition Position OuterPosition区别 在画图的时候,我们经常需要设置Fi…

Leetcode—142.环形链表II【中等】

2023每日刷题(三十三) Leetcode—142.环形链表II 实现代码 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ struct ListNode *detectCycle(struct ListNode *head) {struct ListNode* …

python中sklearn库在数据预处理中的详细用法,及5个常用的Scikit-learn(通常简称为 sklearn)程序代码示例

文章目录 前言1. 数据清洗:使用 sklearn.preprocessing 中的 StandardScaler 和 MinMaxScaler 进行数据规范化。2. 缺失值处理:使用 sklearn.impute 中的 SimpleImputer 来填充缺失值。3. 数据编码:使用 sklearn.preprocessing 中的 OneHotEn…

【左程云算法全讲13】暴力递归

系列综述: 💞目的:本系列是个人整理为了秋招面试的,整理期间苛求每个知识点,平衡理解简易度与深入程度。 🥰来源:材料主要源于左程云算法课程进行的,每个知识点的修正和深入主要参考…

Springboot集成JDBC

1&#xff0c;pom.xml配置jar包 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> 2&#xff0c;配置数据源信息 server:port: 8088spring:datasource:dr…

AI智剪:批量剪辑实战,技巧与实例

随着人工智能技术的不断发展&#xff0c;越来越多的领域开始应用AI技术提升工作效率和质量。其中&#xff0c;AI智剪技术在视频剪辑领域的应用也越来越广泛。AI智剪是一种基于人工智能技术的视频剪辑方法&#xff0c;通过机器学习算法对视频进行自动分析和处理&#xff0c;实现…

AIGC创作系统ChatGPT源码,AI绘画源码,支持最新GPT-4-Turbo模型,支持DALL-E3文生图

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

TCP协议相关实验

文章目录 一.TCP相关实验1.理解CLOSE_WAIT状态2.理解TIME_WAIT状态3.解决TIME_WAIT状态引起的bind失败的方法4.理解listen的第二个参数5.使用Wireshark分析TCP通信流程 二.TCP与UDP1.TCP与UDP对比2.用UDP实现可靠传输&#xff08;经典面试题&#xff09; 一.TCP相关实验 1.理解…

操作系统·进程同步

进程同步&#xff1a;异步环境下的一组并发进程因直接制约而互相发送消息、互相合作、互相等待&#xff0c;使得各进程按照一定的速度执行的过程。 进程同步的主要任务是使并发执行的诸进程之间能有效地共享资源和相互合作&#xff0c;使执行的结果具有可再现性。 4.1 进程同…

LeetCode——字符串(Java)

字符串 简介[简单] 344. 反转字符串[简单] 541. 反转字符串 II[中等] 151. 反转字符串中的单词 简介 记录一下自己刷题的历程以及代码。写题过程中参考了 代码随想录。会附上一些个人的思路&#xff0c;如果有错误&#xff0c;可以在评论区提醒一下。 [简单] 344. 反转字符串…

9 STM32标准库函数 之 独立看门狗(IWDG)所有函数的介绍及使用

9 STM32标准库函数 之 独立看门狗&#xff08;IWDG&#xff09;所有函数的介绍及使用 1. 图片有格式该文档修改记录&#xff1a;总结 函数描述格式&#xff1a; 函数名外设函数的名称函数原形原形声明功能描述简要解释函数是如何执行的输入参数{x}输入参数描述输出参数{x}输出…
最新文章