显式实现接口和实现接口的区别
显式实现接口和实现接口的区别
c#中实现接口与显式实现接口的区别
2008-09-12 15:38
在实现接口的时候,VS提供了两个菜单,一个是"实现接口",一个是"显式实现接口",它们到底有何不一样呢
我们来比较一下看看
1.首先假设我们有一个接口
public interface ICustomer
{
void SomeMethod();//接口的所有成员都暗自成为abstract,我们不能为它提供缺省实现,无论这份实现是 多么平淡无奇;接口的成员也都暗自成为public,我们不能以关键字abstract或 public来修改(修饰)其中某个成员。
}
2.如果是"实现接口",那么代码大致如下
public class Customer:ICustomer
{
#region ICustomer 成员
public void SomeMethod()
{
throw new NotImplementedException();
}
#endregion
}
3.如果是"显式实现接口",那么代码大致如下
public class Customer:ICustomer
{
#region ICustomer 成员
void ICustomer.SomeMethod()//显示接口成员的访问级别暗中是public,不允许程序员再加任何修饰符
{
throw new NotImplementedException();
}
#endregion
}
大家看到差别了吧?显式实现的方式,那些方法都会加上一个前缀的。但是,这到底意味着什么呢?
如果是实现接口
public class DAL {
/// <summary>
/// 如果我们是直接实现接口的话,那么既可以用接口调用方法,也可以用具体类调用方法
/// </summary>
public void GetCustomer() {
Customer customer = new Customer();
customer.SomeMethod();
}
public void GetCustomer2() {
ICustomer customer = new Customer();
customer.SomeMethod();
}
}
如果是显式实现接口
public class DAL {
/// <summary>
/// 如果我们是显式实现接口的话,那么要访问里面的方法就只能是通过接口来调用,而不能通过具体类来做
/// </summary>
public void GetCustomer() {
ICustomer customer = new Customer();
customer.SomeMethod();
}
}
此外,我们还可以在继承接口的类中同时提供实现接口和显式实现接口两种方式,这样就完成了对一个接口成员提供多份实现实体,访问时可以用类的实例和接口的引用来分别调用这两种实现实体。
现在大部分的系统为了保证扩展性,都广泛地使用接口。显式实现接口,可以隐藏具体类的复杂性。
转自:http://hi.baidu.com/wwang634/blog/item/adfb2ace2d99650592457e17.html
总结:
实现接口,俗称也是隐士实现接口:
隐士实现接口,即可以通过实例化的类名点出来方法,也可以通过继承的接口的实例化来点出方法;
HelloJob 类继承的 IJob,实现接口
//实现接口即可以通过类名点出来方法,也可以通过接口来调用
方法1:
HelloJob job = new HelloJob();
JobExecutionContext context = null;
job.Execute(context);
方法2:
IJob job1 = new HelloJob();
job1.Execute(context);
显式实现接口(不要把“显式”写成了“显示”):
只能通过接口来调用方法
HelloJob 类继承的 IJob,显式实现接口
方法1实现不了:
HelloJob job = new HelloJob();
job点不出来
方法2可以实现:
//如果是显式实现接口的话,那么要访问里面的方法就只能是通过接口来调用,而不能通过具体类来做
IJob job1 = new HelloJob();
JobExecutionContext context = null;
job1.Execute(context);
显式实现益处
1:隐藏代码的实现
2:在使用接口访问的系统中,调用者只能通过接口调用而不是底层的类来访问。
在实现接口的时候,VS提供了两个菜单,一个是"实现接口",一个是"显式实现接口",它们到底有何不一样呢 我们来比较一下看看 1.首先假设我们有一个接口 public interface ICustomer 2.如果是"实现接口",那么代码大致如下 public class Customer:ICustomer #region ICustomer 成员 public void SomeMethod() #endregion 3.如果是"显式实现接口",那么代码大致如下 public class Customer:ICustomer #region ICustomer 成员 void ICustomer.SomeMethod()//显示接口成员的访问级别暗中是public,不允许程序员再加任何修饰符 #endregion 大家看到差别了吧?显式实现的方式,那些方法都会加上一个前缀的。但是,这到底意味着什么呢? 如果是实现接口 public class DAL { public void GetCustomer2() { 如果是显式实现接口 public class DAL { 此外,我们还可以在继承接口的类中同时提供实现接口和显式实现接口两种方式,这样就完成了对一个接口成员提供多份实现实体,访问时可以用类的实例和接口的引用来分别调用这两种实现实体。 现在大部分的系统为了保证扩展性,都广泛地使用接口。显式实现接口,可以隐藏具体类的复杂性。 |
显式实现益处
1:隐藏代码的实现
2:在使用接口访问的系统中,调用者只能通过接口调用而不是底层的类来访问。