代码改变世界

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

  钟铧若岩  阅读(6)  评论(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 的接口,通过显式实现可以明确区分不同接口的方法。

 
相关博文:
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示