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日

相关文章

  • SimpleAdmin手摸手教学之:插件管理

    一、前言 在2.0的架构设计中,引入了插件的概念,目的就是为了解决代码臃肿问题,随着系统功能越来越多,System层的代码也越来越多,之前是以文件夹的方式区分功能模块,这样的话代码就过于集中,想找到某一个功能模块的代码就要翻好几个文件夹,不利于以后的开发和维护。所以在新的架构中,我将部分功能模块通过插件的方式提取出来,封装成类库形式的插件,这样System层…

    C# 2023年4月18日
    00
  • 提高C# StringBuilder操作性能优化的方法

    提高C# StringBuilder操作性能优化的方法 前言 StringBuilder是C#语言中常用的字符串操作类之一,用于对字符串进行动态操作,比如追加、替换、插入等。在进行大量字符串操作时,使用StringBuilder可以提高性能,而不必像使用字符串拼接时那样频繁创建和销毁字符串对象。但是,如果使用不得当,StringBuilder也可能出现性能问…

    C# 2023年6月8日
    00
  • ASP.NET Core中Grpc通信的简单用法

    ASP.NET Core中Grpc通信的简单用法 gRPC是一种高性能、开源和通用的远程过程调用(RPC)框架,可以在任何地方运行。在ASP.NET Core中,可以使用gRPC来实现跨平台的通信。本文将介绍ASP.NET Core中gRPC通信的简单用法。 准备工作 在开始之前,需要完成以下准备工作: 安装 .NET Core SDK。 安装 Visual…

    C# 2023年5月17日
    00
  • asp.net页面master页面与ascx用户控件传值的问题

    ASP.NET页面中,Master页面和ASCX用户控件是常见的组件。Master页面通常用于定义网站的整体布局和风格,而ASCX用户控件则用于封装重复使用的控件或作为嵌入其他页面的组件。在一些复杂的应用场景中,我们需要在Master页面和ASCX用户控件之间传递数据或状态,下面是传值的两种方法。 方法一:通过属性(Property)传值 借助于Proper…

    C# 2023年6月3日
    00
  • C#中static的详细用法实例

    下面是关于C#中static的详细用法实例的攻略。 一、static的概念 在C#中,static是一个关键字,用在定义类或方法时,表示这个类或方法是静态的。静态成员或方法可以被类的所有实例或对象共享,不会被实例化的对象占用内存空间。 二、static的实例 1. static成员 class MyClass { public static int Coun…

    C# 2023年5月31日
    00
  • Asp.Net数据输出到EXCEL表格中

    针对 “Asp.Net数据输出到Excel表格中” 的问题,可以提供以下步骤: 1. 添加NuGet包 在Visual Studio中打开你的Asp.Net项目,右击项目文件夹,选择“管理NuGet包”选项。在nuget.org上搜索并添加以下两个包: EPPlus: 用于操作Excel文件的库。 Microsoft.AspNet.WebApi.Core: …

    C# 2023年6月3日
    00
  • c# Thread类线程常用操作详解

    c#Thread类线程常用操作详解 什么是Thread类 Thread 类提供了访问和操作线程的一系列方法和属性。开发人员可以新建和控制线程、设置线程的优先级、执行线程的暂停、继续、等待操作等。Thread 类定义在 System.Threading 命名空间中。 如何创建一个线程 使用 Thread 类来创建一个新线程: Thread thread1 = …

    C# 2023年5月15日
    00
  • C#写一套最全的MySQL帮助类(包括增删改查)

    介绍说明:这个帮助类包含了六个主要的方法:ExecuteNonQuery、ExecuteScalar、ExecuteQuery、ExecuteQuery(泛型)、Insert、Update和Delete。其中,ExecuteNonQuery用于执行不返回结果集的SQL语句;ExecuteScalar用于执行一个查询,并返回结果集中第一行的第一列;Execut…

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