【转】C#接口-显式接口和隐式接口的实现

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

类和接口都能调用到,事实上这就是“隐式接口实现”。

  那么“显示接口实现”是神马模样呢?

  interface IAnimal
  {
    void Dog();
  }
  class Animal:IAnimal
  {
    void IAnimal.Dog()
    {
      Console.WriteLine("dog...");
    }
  }

    //只能通过接口调用

    IAnimal animal = new Animal();

    animal.Dog();

    用类的方法去实现时会报错,不允许,“显示接口实现”只允许接口实现。如果真想用类来实现呢,那必须要进行一下强制类型转换。

    //强制类型转换后即可

    Animal animal = new Animal();
    (animal as IAnimal).Dog();

既然显示接口实现这么不给力,为什么还要存在了,凡事存在即合理。在实际项目中,有时某个类往往会继承多个接口,而接口中往往会有一些相同名称、参数与类型的值。通过显式接口实现可以为避免一些不必要的歧义(我在项目中碰到的不多,可能是因为项目太小的原因吧)。

  显示接口实现与隐式接口实现的适应场景

    1. 当类实现一个接口时,通常使用隐式接口实现,这样可以方便的访问接口方法和类自身具有的方法和属性。
    2. 当类实现多个接口时,并且接口中包含相同的方法签名,此时使用显式接口实现。即使没有相同的方法签名,仍推荐使用显式接口,因为可以标识出哪个方法属于哪个接口。
    3. 隐式接口实现,类和接口都可访问接口中方法。显式接口实现,只能通过接口访问。

-------------=============

隐式地实现接口成员
创建一个接口,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. C# Interface显式实现和隐式实现

    c#中对接口的实现方式有两种:隐式实现和显式实现,之前一直没仔细看过,今天查了些资料,在这里整理一下. 隐式实现的例子 interface IChinese { string Speak(); } p ...

  2. 多态设计 zen of python poem 显式而非隐式 延迟赋值

    总结 1.python支持延迟赋值,但是给调用者带来了困惑: 2.显式而非隐式,应当显式地指定要初始化的变量 class Card: def __init__(self, rank, suit): s ...

  3. C# 数据类型转换 显式转型、隐式转型、强制转型

    C# 的类型转换有 显式转型 和 隐式转型 两种方式. 显式转型:有可能引发异常.精确度丢失及其他问题的转换方式.需要使用手段进行转换操作. 隐式转型:不会改变原有数据精确度.引发异常,不会发生任何问 ...

  4. selenium-webdriver中的显式等待与隐式等待

    在selenium-webdriver中等待的方式简单可以概括为三种: 1 导入time包,调用time.sleep()的方法传入时间,这种方式也叫强制等待,固定死等一个时间 2 隐式等待,直接调用i ...

  5. (java)selenium webdriver学习---三种等待时间方法:显式等待,隐式等待,强制等待

    selenium webdriver学习---三种等待时间方法:显式等待,隐式等待,强制等待 本例包括窗口最大化,刷新,切换到指定窗口,后退,前进,获取当前窗口url等操作: import java. ...

  6. Java并发之显式锁和隐式锁的区别

    Java并发之显式锁和隐式锁的区别 在面试的过程中有可能会问到:在Java并发编程中,锁有两种实现:使用隐式锁和使用显示锁分别是什么?两者的区别是什么?所谓的显式锁和隐式锁的区别也就是说说Synchr ...

  7. 大数据技术之_16_Scala学习_06_面向对象编程-高级+隐式转换和隐式值

    第八章 面向对象编程-高级8.1 静态属性和静态方法8.1.1 静态属性-提出问题8.1.2 基本介绍8.1.3 伴生对象的快速入门8.1.4 伴生对象的小结8.1.5 最佳实践-使用伴生对象解决小孩 ...

  8. Scala 学习之路(十三)—— 隐式转换和隐式参数

    一.隐式转换 1.1 使用隐式转换 隐式转换指的是以implicit关键字声明带有单个参数的转换函数,它将值从一种类型转换为另一种类型,以便使用之前类型所没有的功能.示例如下: // 普通人 clas ...

  9. Scala 系列(十三)—— 隐式转换和隐式参数

    一.隐式转换 1.1 使用隐式转换 隐式转换指的是以implicit关键字声明带有单个参数的转换函数,它将值从一种类型转换为另一种类型,以便使用之前类型所没有的功能.示例如下: // 普通人 clas ...

  10. Scala 中的隐式转换和隐式参数

    隐式定义是指编译器为了修正类型错误而允许插入到程序中的定义. 举例: 正常情况下"120"/12显然会报错,因为 String 类并没有实现 / 这个方法,我们无法去决定 Stri ...

随机推荐

  1. linuxx virutal machine installation

    1. vmplayer download: https://my.vmware.com/web/vmware/free#desktop_end_user_computing/vmware_player ...

  2. Linux服务器磁盘扩展和oracle表空间文件迁移操作记录

    1.环境介绍 服务器硬件:Dell R710 服务器OS:红帽子Linux   RHEL4.8 数据库:Oracle 10g 2.出现的问题 因为数据表每天有上百万的数据写入表,加上建立索引,导致表空 ...

  3. VIM 常用命令

    1.当vi打开时默认为命令模式,要转入输入模式,需要按a或者i键. 命令模式下: :wq  保存并且退出 :w   只保存不推出 :q   不保存退出 :q!  不保存强制退出 :wq! 保存并强制退 ...

  4. POJ3070 Fibonacci[矩阵乘法]

    Fibonacci Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 13677   Accepted: 9697 Descri ...

  5. Winform listview控件、 容器控件

    1.常用的基本属性: (1)FullRowSelect:设置是否行选择模式.(默认为false) 提示:只有在Details视图该属性才有意义. (2) GridLines:设置行和列之间是否显示网格 ...

  6. ASP.NET(C#) Web Api通过文件流下载文件到本地实例

    下载文件到本地是很多项目开发中需要实现的一个很简单的功能.说简单,是从具体的代码实现上来说的,.NET的文件下载方式有很多种,本示例给大家介绍的是ASP.NET Web Api方式返回HttpResp ...

  7. jenkins 入门教程(上)

    jenkins是一个广泛用于持续构建的可视化web工具,持续构建说得更直白点,就是各种项目的"自动化"编译.打包.分发部署.jenkins可以很好的支持各种语言(比如:java, ...

  8. jquery更改输入框type为密码框password

    很蛋疼的一个问题: <input type="text" id="e1" value="123" /> 用juqery将文本框变 ...

  9. 《深入理解计算机系统V2》学习指导

    <深入理解计算机系统V2>学习指导 目录 图书简况 学习指导 第一章 计算机系统漫游 第二章 信息的表示和处理 第三章 程序的机器级表示 第四章 处理器体系结构 第五章 优化程序性能 第六 ...

  10. 关于把.net 2.0的项目升级到.net4.0遇到的一些问题

    进入公司实习的的第一个项目又是是一个升级项目.这次升级的是一个c/s架构的项目. 大致介绍一下这个项目的结构客户端采用winform+devexpress商业控件开发的,数据库是用的oracle数据库 ...