接口的实现分为:隐式实现和显式实现。
隐式接口实现:如果类或者结构要实现的是单个接口,可以使用隐式实现。
显式接口实现:如果类或者结构继承了多个接口,那么接口中相同名称成员就要显式实现。显示实现是通过使用接口的完全限定名来实现接口成员的。
使用显式接口成员执行体通常有两个目的:
1、因为显式接口成员执行体不能通过类的实例进行访问,这就可以从公有接口中把接口的实现部分单独分离开。如果一个类只在内部使用该接口,而类的使用者不会直接使用到该接口,这种显式接口成员执行体就可以起到作用。
2、显式接口成员执行体避免了接口成员之间因为同名而发生混淆。如果一个类希望对名称和返回类型相同的接口成员采用不同的实现方式,这就必须要使用到显式接口成员执行体。如果没有显式接口成员执行体,那么对于名称和返回类型不同的接口成员,类也无法进行实现。
eg:
/// <summary>
/// IGoodbye interface
/// </summary>
public interface IGoodbye
{
void Speak();
void Bye();
}
/// <summary>
/// IHello interface
/// </summary>
public interface IHello
{
void Speak();
}
/// <summary>
/// ISay interface
/// </summary>
public interface ISay
{
void Say();
}
/// <summary>
/// 隐式接口实现
/// </summary>
public class Hello : ISay, IHello
{
public Hello()
{
}
public void Say()
{
Console.WriteLine("Say Hello");
}
public void Speak()
{
Console.WriteLine("Speak Hello");
}
}
/// <summary>
/// 显式接口实现
/// </summary>
public class Speak : IHello, IGoodbye
{
public Speak()
{
}
void IHello.Speak()
{
Console.WriteLine("Hello");
}
void IGoodbye.Speak()
{
Console.WriteLine("Good Bye");
}
void IGoodbye.Bye()
{
Console.WriteLine("Bye-Bye");
}
}
显示接口调用:
Speak speak = new Speak();
((IHello)speak).Speak();
speak.Speak(); // 错误调用
IHello hello = speak;
hello.Speak();
隐式接口调用:
Hello hello = new Hello();
hello.Say();
hello.Speak();