转载:

C#中对于接口的实现方式有隐式接口和显式接口两种:

隐式地实现接口成员
创建一个接口,IChinese,包含一个成员 Speak;我们创建一个类Speaker,实现接口Chinese

//隐藏式实现例子
public interface IChinese
{
string Speak();
}
public class Speaker : IChinese
{
public string Speak()
{
return "中文";
}
}

这个就是隐式实现接口。

隐式实现调用方法如下:

IChinese s = new Speaker();
s.Speak(); Speaker s = new Speaker();
s.Speak();

都可以调用Speak这个方法。

创建一个接口,IEnglish,包含一个成员 Speak;让我们的类Speaker来实现接口IEnglish

//显式实现例子
public interface IEnglish
{
string Speak();
}
public class Speaker : IEnglish
{
string English.Speak()
{
return "English";
}
}

通过这种显示接口实现。Speak方法就只能通过接口来调用:

IEnglish s = new Speaker();
s.Speak();

下面的这种方式将会编译错误:

Speaker s = new Speaker();
s.Speak();

隐式实现和显示实现的区别:

一、语法的区别

1、隐式方式Speaker的成员(Speak)实现有而且必须有自己的访问修饰符(public),显示实现方式Speaker的成员(Speak)不能有任何的访问修饰符。
2、显示实现方式Speaker使用接口名称和一个句点命名该类成员(Speak)来实现的:English.Speak();也就是
二、调用的区别
隐式接口实现的调用,注意类的声明,可以用接口声明,也可以用实现类 Speaker声明。调用者都可以得到调用实例化对象的行为Speak;

class Program
{
static void Main(string[] args)
{
IChinese s = new Speaker();
s.Speak();
Speaker s = new Speaker();
s.Speak();
}
}

显式接口实现调用,注意类的声明,只可以用接口声明,调用者才可以可以得到调用实例化对象的行为Speak;

class Program
{
static void Main(string[] args)
{
IEnglish s = new Speaker();
s.Speak();
//下面写法将引起编译错误错误“PetShop.Speaker”不包含“Speak”的定义;
// Speaker s = new Speaker();
// s.Speak();
}
}

结论:
隐示实现对象声明为接口和类都可以访问到其行为,显示实现只有声明为接口可以访问。

如果两个接口中有相同的方法名,那么同时实现这两个接口的类,就会出现不确定的情形,在编写方法时,也不知道实现哪个接口的方法了。为解决这一问题,C#提供了显示接口实现技术,就是在方法名前加接口名称,用接口名称来限定成员。用“接口名.方法名()”来区分实现的是哪一个接口。

注意:显示接口实现时,在方法名前不能加任何访问修饰符。这种方式和普通方法不同,普通方法前不加访问修饰符,默认为私有的,而显式接口实现时方法前不加任何修饰符,默认为公有的,如果前面加上修饰符,会出现编译错误。

调用显示接口实现的正确方式是通过接口引用,通过接口引用来确定要调用的版本。

下面我们看一下完整实例:

using System;
public interface IPerson
{
  string Name
  {
  get;
  set;
  }
  void Show(string name);
} public interface IStudent
{
  string StudentId
  {
  get;
  set;
  }
  void Show(string studentid);
} public class Student: IPerson, IStudent
{
  private string _name;
  public string Name
  {
  get
  {
  return _name;
  }
  set
  {
  _name = value;
  }
  }   private string _studentid;
  public string StudentId
  {
  get
  {
  return _studentid;
  }
  set
  {
  _studentid = value;
  }
  }   void IPerson.Show(string name)
  {
  Console.WriteLine("姓名为{0}", name);
  }   void IStudent.Show(string studentid)
  {
  Console.WriteLine("学号为{0}", studentid);
  }
} class Program
{
  static void Main()
  {
  Student s = new Student();
  Console.WriteLine("输入姓名");
  s.Name = Console.ReadLine();
  Console.WriteLine("输入学号");
  s.StudentId = Console.ReadLine();
  IPerson per = s;
  per.Show(s.Name);
  IStudent stu = s;
  stu.Show(s.StudentId);
  }
}

C#中对于接口的实现方式的更多相关文章

  1. 【总结】浅谈JavaScript中的接口

    一.什么是接口 接口是面向对象JavaScript程序员的工具箱中最有用的工具之一.在设计模式中提出的可重用的面向对象设计的原则之一就是“针对接口编程而不是实现编程”,即我们所说的面向接口编程,这个概 ...

  2. AutoCAD.NET 不使用P/Invoke方式调用acad.exe或accore.dll中的接口(如acedCommand、acedPostCommand等)

    使用C#进行AutoCAD二次开发,有时候由于C#接口不够完善,或者低版本AutoCAD中的接口缺少,有些工作不能直接通过C#接口来实现,所以需要通过P/Invoke的方式调用AutoCAD的其他DL ...

  3. IntelliJ IDEA中Mapper接口通过@Autowired注入报错的正确解决方式

    转载请注明来源:四个空格 » IntelliJ IDEA中Mapper接口通过@Autowired注入报错的正确解决方式: 环境 ideaIU-2018.3.4.win: 错误提示: Could no ...

  4. python接口测试中常见的两种接口依赖处理方式

    一.请求体的字段依赖 这种情况多数是在当前测试的接口,它的前置接口的请求体中的字段要拿来在当前的接口请求体中继续使用,比如修改用户信息的接口,该接口会使用到用户名的字段,该字段是由创建用户时的请求体中 ...

  5. 在WPF中使用依赖注入的方式创建视图

    在WPF中使用依赖注入的方式创建视图 0x00 问题的产生 互联网时代桌面开发真是越来越少了,很多应用都转到了浏览器端和移动智能终端,相应的软件开发上的新技术应用到桌面开发的文章也很少.我之前主要做W ...

  6. 通过拦截器Interceptor实现Spring MVC中Controller接口访问信息的记录

    java web工程项目使用了Spring+Spring MVC+Hibernate的结构,在Controller中的方法都是用于处理前端的访问信息,Controller通过调用Service进行业务 ...

  7. android 中调用接口发送短信

    android中可以通过两种方式发送短信 第一:调用系统短信接口直接发送短信:主要代码如下: //直接调用短信接口发短信 SmsManager smsManager = SmsManager.getD ...

  8. 介绍Unreal Engine 4中的接口(Interface)使用C++和蓝图

    这个教程是从UE4 Wiki上整理而来. 在C++中直接使用Interface大家应该很熟悉.只是简单先定义一个个有虚函数的基类,然后在子类中实现相应的虚函数.像这样的虚函数的基类一般概念上叫接口.那 ...

  9. Android中的接口回调技术

    Android中的接口回调技术有很多应用的场景,最常见的:Activity(人机交互的端口)的UI界面中定义了Button,点击该Button时,执行某个逻辑. 下面参见上述执行的模型,讲述James ...

随机推荐

  1. nyoj 756 重建二叉树

    重建二叉树主要是给你一颗二叉树的前序遍历的结果和中序遍历的结果或者后序遍历的结果或者中序遍历的结果,让你求出其中的后序遍历的结果或者前序遍历的结果,这里知道其中的两个就能求出第三个,但是知道的两个必须 ...

  2. Gamit解算脚本

    这是一个解算单天的shell脚本,对于初学者很有帮助. 首先就是需要在项目(四个字符)建立rinex brdc igs 还有以年纪日命名的目录,然后提前准备好station.info和lfile.文件 ...

  3. ASP.NET 中的返回按钮的实现【转】

      返回上一页的这个东东在我们做项目的时候一般是用于填写完表单后确认的时候,有对原来输入的数据进行修改时用的,或者是因为网站为了方便浏览者而有心添加 的一个东东,一般这种功能的实现在ASP.net中都 ...

  4. 开发部署一个简单的Servlet

    Servlet是一个执行在服务器端的Java Class文件,载入前必须先将Servlet程序代码编译成.class文件,然后将此class文件放在servlet Engline路径下.Servlet ...

  5. CSS选择符详解之关系选择符篇

    原文:http://www.chinaz.com/web/2012/1017/278553.shtml 相信大家都对CSS选择符都不陌生,选择符包含:元素选择符.关系选择符.属性选择符.伪类选择符.伪 ...

  6. WARNING OGG-01223 TCP/IP error 111 (Connection refused)

    一:问题描述 GGSCI (source_pc) 64> info all Program     Status      Group       Lag at Chkpt  Time Sinc ...

  7. 【转】深入理解Java内存模型(六)——final

    与前面介绍的锁和volatile相比较,对final域的读和写更像是普通的变量访问.对于final域,编译器和处理器要遵守两个重排序规则: 在构造函数内对一个final域的写入,与随后把这个被构造对象 ...

  8. Struts2 手动验证

    * 首先要从页面中获取对应的标签name属性的值,在动作类action中声明同名的属性,提供get和set方法        * 要继承ActionSupport类或者实现Validateable接口 ...

  9. 利用 Makefile 写的小程序

    1.建立一个工程 2.写一个进度条的程序(原理就是在同一位置重复打印某一个字符(变化),达到动态显示的效果) 所以说我们这里只用回车'\r',覆盖这一行以前的输出,重新向缓冲区写数据刷新缓冲区,就能达 ...

  10. S_OK与S_FALSE,E_FAIL

    S_OK是COM服务器返回正确 S_FALSE是COM服务器返回错误,不过这个错误是可以不处理的,不影响程序正常运行.只是结果不是想要的 E_FAIL是必须处理的错误. //// Success co ...