.NET中的三种接口实现方式
摘自:http://www.cnblogs.com/zhangronghua/archive/2009/11/25/1610713.html
一般来说.NET提供了三种不同的接口实现方式,分别为隐式接口实现、显式接口实现、混合式接口实现。这三种方式各有各的特点。
首先来看隐式接口实现,这恐怕是我们使用最多的一种接口实现,因为隐匿接口实现是.NET的默认接口实现方式。下面让我们来看一个隐式接口实现的例子:
using System;
internal class MyClass
{
public void SomeMethod()
{
// 利用接口的方式声明一个Myinplement对象
IMyInterface iObj = new MyInplement();
iObj.MethodA();
// 利用类的方式声明一个Myinplement对象
MyInplement obj = new MyInplement();
obj.MethodB();
}
}
public class MyInplement : IMyInterface
{
#region IMyInterface Members
/// <summary>
/// 利用隐式接口实现方式实现接口中的方法
/// </summary>
public void MethodA()
{
Console.WriteLine("a");
}
/// <summary>
/// 利用隐式接口实现方式实现接口中的方法
/// </summary>
public void MethodB()
{
Console.WriteLine("B");
}
#endregion
}
public interface IMyInterface
{
void MethodA();
void MethodB();
}
上面的代码很简单,我们声明了一个接口,然后利用MyImplement类来实现接口。在实现接口的时候我们选择了隐式接口实现,即在接口中定义的方法签名前加上修饰符来定义实现方法的签名,比如public voidMethodB()。这种隐式接口实现用起来很简单,但却有一个缺点,就是它允许客户可以直接调用实现类中的方法,(即通过MyInplementobj = newMyInplement()这样的方式声明对象)而不是通过接口调用实现类中的方法(即通过的IMyInterface iObj = new MyInplement();方式来声明对象),这无疑增加了代码的耦合性和违反了面向接口编程的原则。那怎么样才能禁止客户直接调用实现类呢? 下面我们看的显式接口实现就可以。
显式接口实现是指实现类在实现接口的方法时在方法的签名上用"接口名.方法名”的样式来定义方法名,同时在方法的签名中不允许带有修饰符,因为所有显式接口实现的方法全是private的,这是.NET为了禁止客户直接调用实现类而硬性规定的。下面我们来看显式接口实现的例子:
using System;
internal class MyClass
{
public void SomeMethod()
{
// 利用接口的方式声明一个Myinplement对象
IMyInterface iObj = new MyInplement();
iObj.MethodA();
// 利用类的方式声明一个Myinplement对象,会报错,因为MyImplement的MethodA方法是private的
MyInplement obj = new MyInplement();
obj.MethodB();
}
}
public class MyInplement : IMyInterface
{
#region IMyInterface Members
/// <summary>
/// 利用显式接口实现方式实现接口中的方法
/// </summary>
void IMyInterface.MethodA()
{
Console.WriteLine("a");
}
/// <summary>
/// 利用显式接口实现方式实现接口中的方法
/// 会报错,因为在显式接口实现时不允许带有修饰符
/// </summary>
public void IMyInterface.MethodB()
{
Console.WriteLine("B");
}
#endregion
}
public interface IMyInterface
{
void MethodA();
void MethodB();
}
上面的代码中有两个地方会报错,这是因为我们在报错的地方违反了显式接口实现的约束。
最后让我们来看混合式接口实现,混合式接口实现就是将隐式接口实现和显式接口实现搭在一起使用,下面让我们来看一个例子:
using System;
internal class MyClass
{
public void SomeMethod()
{
// 利用接口的方式声明一个Myinplement对象
IMyInterface iObj = new MyInplement();
iObj.MethodA();
// 利用类的方式声明一个Myinplement对象,不会报错,因为MyImplement的MethodA方法是public的
MyInplement obj = new MyInplement();
obj.MethodB();
}
}
public class MyInplement : IMyInterface
{
#region IMyInterface Members
/// <summary>
/// 利用显式接口实现方式实现接口中的方法
/// </summary>
void IMyInterface.MethodA()
{
Console.WriteLine("a");
}
/// <summary>
/// 利用隐式接口实现方式实现接口中的方法
/// </summary>
public void MethodB()
{
Console.WriteLine("B");
}
#endregion
}
public interface IMyInterface
{
void MethodA();
void MethodB();
}
上面的代码中我们将MehtodB的实现改为隐式接口实现,这样MyImplement.Method的修饰符就是public的了,代码中就没有错了。
通过简单的代码示例看到了三种接口实现方式的区别,话说在今天之前我一直没有注意到隐式接口实现可以允许实现类直接被调用,而显式接口实现由于实现类中的方法是私有的所以不能被直接调用。看来我对.NET的认识还很初级啊,有许多基础性的知识还没有掌握啊。以后要努力了。
----------->>>
.NET中的三种接口实现方式的更多相关文章
- Android中的三种XML解析方式
在Android中提供了三种解析XML的方式:SAX(Simple API XML),DOM(Document Objrect Model),以及Android推荐的Pull解析方式.下面就对三种解析 ...
- python网络爬虫数据中的三种数据解析方式
一.正则解析 常用正则表达式回顾: 单字符: . : 除换行以外所有字符 [] :[aoe] [a-w] 匹配集合中任意一个字符 \d :数字 [0-9] \D : 非数字 \w :数字.字母.下划线 ...
- 深入浅出spring IOC中三种依赖注入方式
深入浅出spring IOC中三种依赖注入方式 spring的核心思想是IOC和AOP,IOC-控制反转,是一个重要的面向对象编程的法则来消减计算机程序的耦合问题,控制反转一般分为两种类型,依赖注入和 ...
- Asp.Net中的三种分页方式
Asp.Net中的三种分页方式 通常分页有3种方法,分别是asp.net自带的数据显示空间如GridView等自带的分页,第三方分页控件如aspnetpager,存储过程分页等. 第一种:使用Grid ...
- Binding 中 Elementname,Source,RelativeSource 三种绑定的方式
在WPF应用的开发过程中Binding是一个非常重要的部分. 在实际开发过程中Binding的不同种写法达到的效果相同但事实是存在很大区别的. 这里将实际中碰到过的问题做下汇总记录和理解. 1. so ...
- python中的三种输入方式
python中的三种输入方式 python2.X python2.x中以下三个函数都支持: raw_input() input() sys.stdin.readline() raw_input( )将 ...
- Hive中的三种不同的数据导出方式介绍
问题导读:1.导出本地文件系统和hdfs文件系统区别是什么?2.带有local命令是指导出本地还是hdfs文件系统?3.hive中,使用的insert与传统数据库insert的区别是什么?4.导出数据 ...
- javascript中var let const三种变量声明方式
javascript中var let const三种变量声明方式 1.var ①var表示声明了一个变量,并且可以同时初始化该变量. ②使用var语句声明的变量的作用域是当前执行位置的上下文:一个函 ...
- SQL Server中的三种Join方式
1.测试数据准备 参考:Sql Server中的表访问方式Table Scan, Index Scan, Index Seek 这篇博客中的实验数据准备.这两篇博客使用了相同的实验数据. 2.SQ ...
随机推荐
- java总结第四次//常用类
六.常用类 主要内容:Object类.String类.Date类.封装类 (一)Object类 1.Object类是所有Java类的根父类 2.如果在类的声明中未使用extends关键字指明其父类,则 ...
- Add baidu map in your website (wordpress)
手动挡 访问应用(AK)Key http://lbsyun.baidu.com/apiconsole/key Basic Map Generator http://api.map.baidu.com/ ...
- Class.forName("ClassName")与ClassName.class的区别
引发问题的来源:最近在看比较深入的JVM相关的书,不得不感慨,JVM确实是比较深奥,很多地方难以理解不说,在网上还找不到什么资料,发现一个左思右想都想不明白的问题上网来搜索,结果基本上都是从书上cop ...
- win8以上系统,设置英文为默认输入法
说明:这里将添加“简体中文(美式键盘)”,也就是英文输入法,并设置为默认输入法. 1.打开控制面板—时钟.语言和区域—语言,点击“添加语言”,选择“英语”—打开,选择“英语(美国)” —添加. 2.选 ...
- git 上传本地文件到github
git 上传本地文件到github 1 git config --global user.name "Your Real Name" 2 git config --global u ...
- symfony中twig的模板载入
模板 载入模板 {% include ‘sidebar.html’ %} 当前模板的变量也会传递到 被include的模板里,在那里面可以直接访问你这个模板的变量. {% for comment in ...
- Ecshop后台订单列表增加”商品名”检索字段
近期ecshop网站做活动,统计商品订单量的时候没有按商品名搜索的选项,只能手动查询.这样效率很低下,而且容易出错. 现在为列表增加一个简单的“按商品名搜索”表单项.效果如下图 涉及到2个文件,分别是 ...
- oracle 树状查询
做树状查询的时候,oracle有自己的优势,一条sql语句就可以搞定,而mysql这种数据库就只能用递归了... 递归的项目实例: //递归取到栏目路径 public List getTreeList ...
- 20151124002 treeView 数型菜单的操作
20151124002 treeView 数型菜单的操作 protected void FillTree() { SqlConnection1 = new Syst ...
- js实现图片的瀑布流
先看效果: 初始状态: