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


在C#中,接口的实现可以是隐式的也可以是显式的。这两种方式各有其适应场景,下面将分别解释这两种实现方式及其适用情况。

### 隐式实现

隐式实现是最常见的接口实现方式。当你直接在类中实现接口成员时,就使用了隐式实现。隐式实现的接口成员在类的内部和外部都可以通过类的实例直接访问。

**适应场景**:

- 当接口方法的实现在类的上下文中具有逻辑意义,且你希望类的用户能够通过类的实例直接调用这些方法时。

- 当接口方法不需要区分是哪个接口的成员时。

**示例**:


interface IMyInterface
{
    void MyMethod();
}

class MyClass : IMyInterface
{
    // 隐式实现
    public void MyMethod()
    {
        // 实现逻辑
        Console.WriteLine("MyMethod implemented.");
    }
}

// 使用
var obj = new MyClass();
obj.MyMethod(); // 直接调用

### 显式实现

显式实现要求你在实现接口成员时,通过接口名和点操作符来指定你正在实现的是哪个接口的哪个成员。这种方式下,接口成员只能通过接口的引用访问,而不能直接通过类的实例访问。

**适应场景**:

- 当一个类实现了多个接口,而这些接口中包含了具有相同签名的成员时。

- 当你希望类的用户仅通过接口引用来访问这些接口方法,而不直接通过类的实例访问时。

**示例**:


interface IInterface1
{
    void MyMethod();
}

interface IInterface2
{
    void MyMethod();
}

class MyClass : IInterface1, IInterface2
{
    // 显式实现
    void IInterface1.MyMethod()
    {
        Console.WriteLine("IInterface1.MyMethod implemented.");
    }

    void IInterface2.MyMethod()
    {
        Console.WriteLine("IInterface2.MyMethod implemented.");
    }
}

// 使用
var obj = new MyClass();
IInterface1 i1 = obj;
i1.MyMethod(); // 调用IInterface1的MyMethod

IInterface2 i2 = obj;
i2.MyMethod(); // 调用IInterface2的MyMethod

// 直接通过MyClass实例调用MyMethod会报错,因为它们是显式实现的
// obj.MyMethod(); // 编译错误

综上所述,隐式实现和显式实现各有其适用场景。在选择时,应根据实际需求和对类设计的考虑来决定使用哪种方式。