C# 接口的隐式与显示实现及适应场景

C# 接口提供了一种将实现细节和表示细节分离的方法。使用接口可以定义类应该实现的属性、方法和事件,而不需要指定它们的实现细节。接口的隐式和显式实现机制是实现接口时需要注意的地方。

隐式实现和显示实现

C# 接口有两种实现方式:隐式实现和显示实现。这两种实现方式根据实现方法的可见性和调用方式的不同而不同。

隐式实现

在隐式实现中,接口的方法和属性在实现类中的实现,与其它普通方法和属性实现方式相同。这意味着可以像普通方法一样调用实现的方法和属性,无需使用接口名称。

以下是使用隐式实现方式实现接口的示例:

interface IInterface {
    void Hello();
}

class MyClass : IInterface {
    public void Hello() {
        Console.WriteLine("Hello World!");
    }
}

在这里,MyClass 类实现了 IInterface 接口中的 Hello 方法。 Hello 方法的实现与其它普通方法的实现方式没有区别。可以在其他方法中直接调用 Hello 方法,也不需要使用接口名称。

MyClass obj = new MyClass();
obj.Hello(); // 直接调用 Hello 方法

显示实现

在显示实现中,实现类必须明确声明实现了接口。这意味着无法使用类名称直接调用实现的方法和属性。相反,必须使用接口名称来调用它们。

以下是使用显示实现方式实现接口的示例:

interface IInterface {
    void Hello();
}

class MyClass : IInterface {
    void IInterface.Hello() {
        Console.WriteLine("Hello World!");
    }
}

在这里,MyClass 类实现了 IInterface 接口中的 Hello 方法。但是,由于它是使用显示名称实现的,因此调用 Hello 方法时必须使用接口名称 IInterface

MyClass obj = new MyClass();
((IInterface)obj).Hello(); // 调用实现类的接口方法

适用场景

  • 隐式实现通常用于不需要依赖于接口的实现,也就是说,一个类有多个实现接口的方法。
  • 显示实现通常用于提供不同的实现方式,例如,同一个类实现了相同的方法但需要根据不同实现的场景来调用方法实现。

示例

隐式实现

以下示例中,定义了一个简单的数据访问类 SqlDataAccess,它实现了两个接口:IReadIWrite。这两个接口都声明了名为 GetDataWriteData 的方法。之后,调用这两种方法的方式看起来与调用普通方法相同。

interface IRead {
    string GetData();
}

interface IWrite {
    void WriteData(string data);
}

class SqlDataAccess : IRead, IWrite {
    public string GetData() {
        // 从数据库获取数据
        return "Data from SqlDataAccess.GetData()";
    }

    public void WriteData(string data) {
        // 写入数据到数据库
        Console.WriteLine("SqlDataAccess.WriteData: " + data);
    }
}

class Program {
    static void Main(string[] args) {
        SqlDataAccess dataAccess = new SqlDataAccess();
        string data = dataAccess.GetData();
        Console.WriteLine(data);
        dataAccess.WriteData("Hello World!");
    }
}

显示实现

以下示例是显示实现的示例,它显示实现了 IDatabaseReaderIDatabaseWriter 接口。

在该示例中,两个接口都声明了名为 GetDataWriteData 的方法。但是,这些方法已经被明确声明为实现 IDatabaseReaderIDatabaseWriter 接口。在实例化时,必须使用接口名称来调用这些方法。

interface IDatabaseReader {
    string GetData();
}

interface IDatabaseWriter {
    void WriteData(string data);
}

class SqlDataAccess : IDatabaseReader, IDatabaseWriter {
    string IDatabaseReader.GetData() {
        // 从数据库获取数据
        return "Data from SqlDataAccess.GetData()";
    }

    void IDatabaseWriter.WriteData(string data) {
        // 写入数据到数据库
        Console.WriteLine("SqlDataAccess.WriteData: " + data);
    }
}

class Program {
    static void Main(string[] args) {
        SqlDataAccess dataAccess = new SqlDataAccess();
        string data = ((IDatabaseReader)dataAccess).GetData();
        Console.WriteLine(data);
        ((IDatabaseWriter)dataAccess).WriteData("Hello World!");
    }
}

在这个例子中,需要使用接口名称来调用实现的方法 和 属性。需要注意的是,在该示例中,实现的方法和属性都是显式实现的,即不能通过对象实例调用。需要将对象强制转换为接口类型并调用其方法。

以上就是关于 C# 接口隐式和显示实现的攻略,希望这篇文章可以帮助您更好地理解 C# 接口的实现方式。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C# 接口的隐式与显示实现及适应场景 - Python技术站

(0)
上一篇 2023年5月14日
下一篇 2023年5月14日

相关文章

  • 在Winform分页控件中集成保存用户列表显示字段及宽度调整设置

    在Winform的分页控件里面,我们提供了很多丰富的功能,如常规分页,中文转义、导出Excel、导出PDF等,基于DevExpress的样式的分页控件,我们在其上面做了不少封装,以便更好的使用,其中就包括集成保存用户列表显示字段及宽度调整设置。本篇随笔介绍这个实现的过程,通过在当前程序中序列化方式存储一个记录用户设置的文件,提供介质的存储和加载处理。 1、集…

    C# 2023年5月11日
    00
  • Redis数据库基础与ASP.NET Core缓存实现

    Redis数据库基础与ASP.NET Core缓存实现 Redis是一种高性能的键值存储数据库,常用于缓存、消息队列、会话管理等场景。本攻略将介绍Redis数据库的基础知识,并演示如何在ASP.NET Core应用程序中使用Redis作为缓存。 Redis数据库基础 安装Redis 在使用Redis之前,需要先安装Redis。可以使用以下命令在Ubuntu上…

    C# 2023年5月17日
    00
  • C#网页跳转方法总结

    C#网页跳转方法总结 本篇文章旨在介绍常见的C#网页跳转方法,并为读者提供实用的示例代码及说明,以帮助实现各种网页跳转需求。 Response.Redirect方法 Response.Redirect方法可通过重定向网页实现页面跳转。该方法是将异常抛出到表示请求的客户端,然后由客户端执行新请求,因此会增加客户端向服务器的请求数,但对应用程序的实现更为简便。以…

    C# 2023年6月3日
    00
  • ASP.NET中常用的三十三种代码第6/7页

    ASP.NET中常用的三十三种代码是一份非常实用的代码攻略,里面详细介绍了 ASP.NET 中常用的三十三种代码技巧及其应用场景。 下面我将结合具体的示例来详细讲解攻略的一些关键知识点。 Chapter 6:多语言和本地化 在多语言和本地化方面,攻略中提供了许多有用的代码技巧,可以帮助我们在国际化的环境中更加方便地开发应用。下面介绍两个示例: 示例1:在页面…

    C# 2023年5月31日
    00
  • Untiy Shader实现纹理贴图滚动

    让我来详细讲解一下Unity Shader实现纹理贴图滚动的完整攻略。 简介 在游戏中,经常会出现需要让纹理贴图进行滚动的场景。比如,在一个街机游戏中,需要让背景贴图进行不断的水平或垂直移动,模拟出角色奔跑的效果。那么该如何实现这个效果呢?下面就让我们来看一下Unity Shader如何实现纹理贴图滚动。 Shader语言 在Unity Shader中,我们…

    C# 2023年6月7日
    00
  • C#中for循环、while循环循环执行的方法

    C#中的for循环和while循环是常用的循环结构,用于重复执行相同或类似的代码块,下面是它们的详细讲解和示例说明: for循环 for循环是一种经典的循环语句,用于重复执行一段代码,可以控制循环变量的初始值、终止条件和每次循环变量的增量。for循环的语法如下: for (初始化表达式; 循环条件; 迭代语句) { // 循环体语句 } 其中,初始化表达式只…

    C# 2023年6月7日
    00
  • BootStrap实现带有增删改查功能的表格(DEMO详解)

    BootStrap实现带有增删改查功能的表格(DEMO详解) 在Web开发中,表格是一个非常常见的组件。为了提高表格的交互性和用户体验,我们通常会在表格中添加增删改查等功能。本文将介绍如何使用BootStrap实现带有增删改查功能的表格。 环境准备 在使用BootStrap实现带有增删改查功能的表格前,需要先了解以下知识: BootStrap:一个流行的前端…

    C# 2023年5月15日
    00
  • 浅谈Java多线程实现及同步互斥通讯

    浅谈Java多线程实现及同步互斥通讯 引言 多线程是指一种多个线程执行完毕后可以得到更好的系统性能的机制。Java多线程的实现是通过创建Thread实例或者继承Thread类并重写它的run()方法来完成的。Java也提供了一个Java.util.concurrent包,它为Java多线程编程提供了更多的助力。在多线程编程中,同步互斥是一种非常重要的问题,它…

    C# 2023年6月7日
    00
合作推广
合作推广
分享本页
返回顶部