代码改变世界

说说显示实现接口和隐式实现接口的区别

2025-02-16 14:36  钟铧若岩  阅读(90)  评论(0)    收藏  举报
在 C# 中,实现接口有显式实现和隐式实现两种方式,它们在语法、访问方式和使用场景等方面存在一些区别,下面为你详细介绍。

语法差异

隐式实现接口


当使用隐式实现接口时,接口的方法会被当作类的公共方法来实现,不需要额外的限定符。
// 定义一个接口
public interface IMyInterface
{
    void DoSomething();
}

// 隐式实现接口的类
public class MyClass : IMyInterface
{
    // 直接实现接口方法,无需额外限定
    public void DoSomething()
    {
        Console.WriteLine("隐式实现接口方法");
    }
}

显式实现接口

 

显式实现接口时,需要在方法名前加上接口名称和点号,以此明确表明该方法是为特定接口实现的。
// 定义一个接口
public interface IMyInterface
{
    void DoSomething();
}

// 显式实现接口的类
public class MyClass : IMyInterface
{
    // 显式实现接口方法,需要指定接口名
    void IMyInterface.DoSomething()
    {
        Console.WriteLine("显式实现接口方法");
    }
}

访问方式差异

隐式实现接口

 

隐式实现的接口方法可以通过类的实例直接访问,也可以通过接口引用访问。
MyClass myClass = new MyClass();
// 通过类实例访问
myClass.DoSomething(); 

IMyInterface myInterface = myClass;
// 通过接口引用访问
myInterface.DoSomething(); 

显式实现接口

 

显式实现的接口方法只能通过接口引用访问,不能通过类的实例直接访问。
MyClass myClass = new MyClass();
// 以下代码会编译错误,不能通过类实例直接访问显式实现的接口方法
// myClass.DoSomething(); 

IMyInterface myInterface = myClass;
// 通过接口引用访问
myInterface.DoSomething(); 

方法访问修饰符差异

隐式实现接口

 

隐式实现的接口方法必须使用 public 访问修饰符,因为它们被视为类的公共方法。
public class MyClass : IMyInterface
{
    // 必须使用 public 修饰符
    public void DoSomething()
    {
        Console.WriteLine("隐式实现接口方法");
    }
}

显式实现接口

 

显式实现的接口方法不能使用任何访问修饰符,因为它们只能通过接口引用访问,访问级别由接口本身决定。
public class MyClass : IMyInterface
{
    // 不能使用访问修饰符
    void IMyInterface.DoSomething()
    {
        Console.WriteLine("显式实现接口方法");
    }
}

使用场景差异

隐式实现接口

 

当类需要将接口方法暴露为公共方法,并且希望类的使用者能够直接通过类的实例调用这些方法时,通常使用隐式实现。例如,在实现一些通用的功能接口,且这些功能需要在类的外部被广泛使用时。

显式实现接口

 

当一个类实现多个接口,且这些接口包含同名方法时,显式实现可以避免方法调用的歧义。另外,当你不希望类的使用者直接访问接口方法,而只能通过接口引用访问时,也可以使用显式实现。
 
public interface IInterface1
{
    void Method();
}

public interface IInterface2
{
    void Method();
}

public class MyClass : IInterface1, IInterface2
{
    // 显式实现接口方法,避免方法调用歧义
    void IInterface1.Method()
    {
        Console.WriteLine("实现 IInterface1 的 Method 方法");
    }

    void IInterface2.Method()
    {
        Console.WriteLine("实现 IInterface2 的 Method 方法");
    }
}

在上述示例中,MyClass 实现了两个包含同名方法 Method 的接口,通过显式实现可以明确区分不同接口的方法。