详解C#中对于接口的实现方式(隐式接口和显式接口)

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);
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C#实现两接口中同名方法实例分析

    本文实例讲述了C#实现两接口中同名方法.分享给大家供大家参考.具体分析如下: 对于一个类实现两个接口,而这两个接口又有同名方法,C#中的处理方式如下: using System; using System.Collections.Generic; using System.Text; namespace Super { class Program { static void Main(string[] args) { SuperMan sm = new SuperMan(); sm.NightW

  • C#接口实现方法实例分析

    本文实例讲述了C#接口实现方法.分享给大家供大家参考.具体如下: 在讲解C#实现接口的实例解析之前我们来看看C#接口的定义,如果一个类派生于一个接口,它就会执行某些函数.并不是所有的面向对象语言都支持接口,所以本节将详细介绍C#实现接口的问题. C#实现接口注意: 熟悉COM的开发人员应注意,尽管在概念上C#接口类似于COM接口,但它们是不同的,底层的结构不同,例如,C#接口并不派生于IUnknown.C#接口根据.NET函数提供了一个契约.与COM接口不同,C#接口不代表任何类型的二进制标准.

  • C# 接口的隐式与显示实现及适应场景

    以前在用到接口时,从来没注意到接口分为隐式实现与显示实现.昨天在浏览博客时看到相关内容,现在根据自己的理解记录一下,方便日后碰到的时候温习温习. 通俗的来讲,"显示接口实现"就是使用接口名称作为方法名的前缀;而传统的实现方式称之为:"隐式接口实现".费话不说,例子如下: 复制代码 代码如下: interface IAnimal { void Dog(); } class Animal:IAnimal { public void Dog() { Console.Wri

  • C#8.0 中开启默认接口实现方法

    当你升级到 C# 8.0 和 .NET Core 3.0 之后,你就可以开始使用默认接口实现的功能了. 从现在开始,你可以在接口里面添加一些默认实现的成员,避免在接口中添加成员导致大量对此接口的实现崩溃. 最低要求 要写出并且正常使用接口的默认实现,你需要: C# 8.0 .NET Core 3.0 Visual Studio 2019 Preview (16.1 以上版本) 下载安装 Visual Studio 2019 Preview 版本 前往下载安装 Visual Studio Prev

  • C#判断一个类是否实现了某个接口3种实现方法

    B为一个类,ISay为一个接口. 方法1: 复制代码 代码如下: B b = new B();   if (b.GetType().GetInterface("ISay") != null)             {                 //如果实现了接口"ISay",...             } 方法2: 复制代码 代码如下: B b = new B();  if (b is ISay)             {               

  • C#隐式/显示实现接口方法详解

    接口定义了一系列的行为规范,为类型定义一种Can-Do的功能.例如,实现IEnumerable接口定义了GetEnumerator方法,用于获取一个枚举数,该枚举数支持在集合上进行迭代,也就是我们常说的foreach.接口只是定义行为,具体的实现需要由具体类型负责,实现接口的方法又分为隐式实现与显示实现. 一.隐式/显示实现接口方法 简单的说,我们平时"默认"使用的都是隐式的实现方式.例如: interface ILog { void Log(); } public class Fil

  • C#中的应用程序接口介绍及实现,密封类与密封方法

    API  Application Programming Interface 应用程序接口 接口 定义 :指描述可属于任何类或结构的一组相关功能. 接口的成员可以是方法(不能有方法体),属性,事件和索引器,但不能包含常数,字段,运算符,实例构造函数析构函数或类,也不能包括任何种类的静态成员,接口中的成员不允许添加访问修饰符,(默认都是public) 简介: 1. 接口是一个引用类型,通过接口可以实现多重继承. 2. C#中接口的成员不能有new.public.protected.internal

  • C#显式地实现接口成员的方法

    本文实例讲述了C#显式地实现接口成员的方法.分享给大家供大家参考.具体实现方法如下: // explicit1.cs interface IDimensions { float Length(); float Width(); } class Box : IDimensions { float lengthInches; float widthInches; public Box(float length, float width) { lengthInches = length; widthI

  • C#中实现判断某个类是否实现了某个接口

    有时我们需要判断某个类是否实现了某个接口(Interface),比如在使用反射机制(Reflection)来查找特定类型的时候. 简单来说,可以使用Type.IsAssignableFrom方法: typeof(IFoo).IsAssignableFrom(bar.GetType()); typeof(IFoo).IsAssignableFrom(typeof(BarClass)); 从字面意思可以看出,IsAssignableFrom表示BarClass类型能否赋值给IFoo接口,所以它返回t

  • C#中IDispose接口的实现及为何这么实现详解

    前言 我原本认为对于IDispose的实现方法,只要在里面释放非托管资源就行了,但是通过网上资料,看到很多实现方法并不是仅仅做释放非托管资源,非常迷惑,关键是这些资料也没详细的告诉你为什么这么做?之后通过StackOverflow了解到这一步一步的原因,说的十分详细,结合自己的认识,翻译后分享给大家: 一.IDispose的实现方法 具体的实现方法,你可以直接查看这个我们网站的教程: //www.jb51.net/article/54899.htm 如果你能看懂,并且很清楚为什么那么做.那么以下

随机推荐