关于接口的实现问题,我尽量通俗的解释下:
假设你设定了某个接口Interface I1; 里面有个需要实现的方法, 如 int func1();
那么, 进一步的,你写了一个类C1, 去实现这个接口I1, 此时就有两种实现的方法:
方法1:显示实现,
public int func1(){.....}
方法2:隐式实现,
private int func1(){.....} (或protected int func1(){.....})
发现区别了吧,如果是显示的,那么进一步,你可以通过C1.func1();来执行这个函数,即:
C1 myC1 = new C1();
myC1.func1();
但是隐式就不能这样,因为private(或protected)修饰词不允许用户直接访问,但你仍然可以通过接口访问这个函数,即:
I1 myI1 = new C1(); //注意,此时myI1是接口, 并通过C1实现了这个接口.
myI1.func1(); //通过接口访问了某个隐式实现的函数.
这就是你问题中所说的内容.
希望对你有帮助
给你看一段代码你就完全明白了:
namespace Test1
{
class Program
{
public static void Main(string[] args)
{
IA a = new C();
a.Call(); //可以看到显示接口实现的方法(即Call())只能通过接口a来访问;
C c = new C();
c.Call(); //错误,无法通过类访问;
c.Move(); //可以看到隐式接口实现的方法(即Move())还可以通过类C来直接访问;
Console.ReadLine();
}
}
interface IA
{
void Call();
}
interface IB
{
void Move();
}
class C:IA
{
void IA.Call() //这就是你想知道的接口的显示执行,其实我们一般叫做显示接口成员实现
{
Console.WriteLine("IA");
}
public void Move() //这就是你想知道的接口的隐式执行,当然我们一般叫做隐式接口成员实现
{
Console.WriteLine("IB");
}
}
}
上面的注释中已经说明了什么是接口的显式执行(实现)和 隐式执行(实现);
至于区别,其实就是一个写法的区别,显式执行使用的是接口的完全限定名,但是隐式执行只是在实现它的类中使用一般的名称(前面没有带上方法所属的 接口+ “.”)
至于它们的使用,你可以查阅一下 关于“显式接口成员实现”相关的介绍,这方面的资料很多,最基本 一个功能就是可以消除因同时含有多个签名相同的接口成员所引起的多义性。
如:
interface IA
{
void Call();
}
interface IB
{
void Call();
}
class C:IA ,IB
{
//实现代码,这里如果需要对不同的接口成员有不同的实现,就需要使用显式接口成员实现了,IA.Call() IB.Call();
}
我想你应该明白的~