隐式 vs 显式接口实现

12 浏览
0 Comments

隐式 vs 显式接口实现

可能重复:
\nC#: 接口 - 隐式和显式实现 \n有人能解释一下这两种方法的区别以及如何使用它们吗?据我所知,许多2.0之前的类在实现时没有使用泛型类型,因此后来的版本需要同时实现两种接口。这是唯一需要使用它们的情况吗?\n你还可以详细解释一下如何使用它们吗?\n谢谢

0
0 Comments

隐式接口实现和显式接口实现是C#中的两种不同的方式。隐式接口实现可以进行is-a类型转换,而显式接口实现只有在对象被显式地类型转换为该接口类型时才能访问。

在解决冲突时,隐式实现是指在同一类中简单实现具有相同名称和签名的特定方法,而显式实现是指在该类中使用接口名称来实现具有相同名称和签名的方法。

那么为什么会出现这个问题呢?在C#中,一个类可以实现多个接口,而这些接口可能具有相同名称和签名的方法。当一个类实现多个接口时,编译器需要确定如何处理这些冲突。

为了解决这个问题,C#引入了隐式接口实现和显式接口实现的概念。隐式接口实现允许类在自身实现接口方法时使用相同的名称和签名,而显式接口实现则要求类在实现接口方法时使用接口名称作为前缀。

通过这种方式,编译器可以根据调用方式来确定要调用的方法。如果使用类的实例调用方法,则会调用隐式实现的方法。如果使用接口的实例调用方法,则会调用显式实现的方法。

下面是一个示例代码,演示了隐式接口实现和显式接口实现的区别:

using System;
interface IInterface
{
    void Method();
}
class MyClass : IInterface
{
    public void Method()
    {
        Console.WriteLine("Implicit implementation");
    }
    void IInterface.Method()
    {
        Console.WriteLine("Explicit implementation");
    }
}
class Program
{
    static void Main(string[] args)
    {
        MyClass myClass = new MyClass();
        myClass.Method(); // 调用隐式实现的方法
        IInterface myInterface = myClass;
        myInterface.Method(); // 调用显式实现的方法
        Console.ReadKey();
    }
}

输出结果为:

Implicit implementation
Explicit implementation

通过这个例子,我们可以看到隐式实现的方法可以通过类的实例直接调用,而显式实现的方法只能通过接口的实例来调用。

总结起来,隐式接口实现和显式接口实现是为了解决在一个类实现多个接口时可能出现的方法名称和签名冲突的问题。隐式接口实现提供了一种简单的方式来实现接口方法,而显式接口实现则提供了一种更明确和精确的方式来实现接口方法。

0
0 Comments

隐式接口实现和显式接口实现是解决类继承多个接口且接口中存在相同方法名的问题。在隐式接口实现中,当一个类继承了两个或多个接口,并且这些接口具有相同的方法名时,类无法知道实现的是哪个接口的方法。这是使用显式接口实现的场景之一。

在隐式接口实现中,代码如下:

public class MyClass : InterfaceOne, InterfaceTwo
{
    public void InterfaceMethod()
    {
        Console.WriteLine("Which interface method is this?");
    }
}
interface InterfaceOne
{
    void InterfaceMethod();
}
interface InterfaceTwo
{
    void InterfaceMethod();
}

在显式接口实现中,代码如下:

public class MyClass : InterfaceOne, InterfaceTwo
{
    void InterfaceOne.InterfaceMethod()
    {
        Console.WriteLine("Which interface method is this?");
    }
    void InterfaceTwo.InterfaceMethod()
    {
        Console.WriteLine("Which interface method is this?");
    }
}
interface InterfaceOne
{
    void InterfaceMethod();
}
interface InterfaceTwo
{
    void InterfaceMethod();
}

通过显式接口实现,可以明确指定类实现的是哪个接口的方法。

需要注意的是,显式接口实现的方法不能使用public访问修饰符,因为接口的方法默认为公共成员。

在下面的链接中有一个很好的视频解释了这个概念:Explicit Interface Implementation

0
0 Comments

隐式接口实现和显式接口实现的产生原因是因为有时候需要实现具有相同签名的两个接口,并且对这些属性/方法有不同的实现,或者类中存在与接口具有相同签名的属性/方法。在使用隐式接口实现时,可以像访问类的成员一样访问接口的方法和属性,而在使用显式接口实现时,只能在将其视为该接口时才能访问它们。

关于何时使用其中一种方法而不是另一种方法,以下规则来自Brad Abrams的设计指南博客:

1. 不要将显式成员用作安全边界。任何将实例转换为接口的客户端都可以调用它们。

2. 使用显式成员来隐藏实现细节。

3. 使用显式成员来近似私有接口实现。

4. 对于子类允许覆盖的任何显式实现成员,提供另一种访问的方式。使用相同的方法名称,除非存在冲突。

在Brad的博客评论中还提到了在值类型上使用显式实现时涉及到装箱的性能成本,因此需要注意性能开销。

,隐式接口实现和显式接口实现的出现是为了解决类实现多个接口时的命名冲突问题,通过不同的方式访问接口的方法和属性,并隐藏实现细节。根据具体需求和设计目的,选择适合的实现方式。

0