博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
这次是C#中的接口
阅读量:4608 次
发布时间:2019-06-09

本文共 3323 字,大约阅读时间需要 11 分钟。

 接口的出现,是为了解决C#中不允许多重继承的问题。

1、什么是接口?

我觉得可以把接口理解为对一组方法声明进行的统一命名,但这些方法没有提供任何实现。

通过接口,就可以对方法进行统一管理,避免了在每种类型中重复定义这些方法。

 

2、如何使用接口来编程

2.1 接口的定义

interface ICustomCompare

{

  //定义比较方法,继承该接口的类都要实现该方法

  int CompareTo(object other);

}

在接口中定义方法不能添加任何访问修饰符,因为接口中的方法默认是public,如果显示地指定了修饰符,则会出现编译时错误。也不能使用static关键字进行修饰。

在接口中除了可以定义方法外,还可以包含属性、事件、索引器,或者这4类成员(包括方法)类型的任意组合;但接口类型不能包含字段、运算符重载、实例构造函数和析构函数。

 

2.2 继承接口

public class Person:ICustomCompare

{

  int age;

  public int Age{get{return age;} set{age=value;}}

  //实现接口方法

  public int CompareTo(object value)

  {

    if(value==null)

    {

      return 1;  

    }

    //将Object类型强制转换为Person类型

    Person otherp=(Person)value;

    //把当前对象的Age属性与需要比较的对象的Age属性进行对比

    if(this.Age<otherp.Age)

    {

      return -1;

    }  

    if(this.Age>otherp.Age)

    {

      return 1;

    }

    return 0;  

  }

}

在上面的的Person类中,实现了ICustomCompare接口中的CompareTo方法。

CompareTo方法会首先判断参数对象是否为null,如果为null,则直接返回1,代表当前对象比传入对象大。

如果对象不为空的话,强制转换成Person类型,对Age属性进行对比,当前对象的Age属性值比传入对象的Age属性值大,则返回1,如果返回-1,则说明当前对象的Age属性比传入的对象小。

 

2.3 调用接口中的方法

class Program

{

  static void Main(string[] args)

  {

    Person p1=new Person();

    p1.Age=18;

    Person p2=new Person();

    p2.Age=19;

    //调用接口中方法,对p1和p2进行比较

    if(p1.CompareTo(p2)>0)

    {

      Console.WriteLine("p1比p2大");

    }

    else if(p1.CompareTo(p2)<0)

    {

      Console.WriteLine("p1比p2小");

    }

    else

    {

      Console.WriteLine("p1比p2一样大");

    }

    Console.ReadKey();

  }

}

 

3、显示接口实现方法

在上面的示例代码当中,使用了隐式的接口实现方式,即在实现代码中没有指定实现哪个接口中的CompareTo方法。

当然,也存在显式的接口实现方式,在类实现接口的过程中,明确指出实现哪一个接口中的哪一个方法。

interface IChineseGreeting

{

  //方法声明

  void SayHello();

}

interface IAmericanGreeting

{

  //方法声明

  void SayHello();

}

//Speaker类实现了两个接口

public class Speaker:IChineseGreeting,IAmericanGreeting

{

  //隐式接口实现

  public void SayHello()

  {

    Console.WriteLine("你好");

  }

}

上面的Speaker类实现了两个接口,碰巧两个接口中声明的方法具有相同的返回类型、相同的方法名称和相同的参数。若采用隐式的接口实现方式,下面的代码将调用相同的SayHello方法。

static void Main(string[] args)

{

  Speaker speaker=new Speaker();

  //调用中国人打招呼方法

  IChineseGreeting chinese=(IChineseGreeting)speaker;

  chinese.SayHello();

 

  //调用美国人招呼方法 

  IAmericanGreeting American=(IAmericanGreeting)speaker;

  American.SayHello();

}

当Main函数执行的时候,得到的接口是两个 “你好”;

这并不是我们期望的结果,所以这种情况下,我们必须使用显式的接口实现方式来解决这个命名冲突问题。

//Speaker类实现了两个接口

public class Speaker:IChineseGreeting,IAmericanGreeting

{

  //显式接口实现

  void IChineseGreeting.SayHello()

  {

    Console.WriteLine("你好");

  }

  

  //显式接口实现

  void IAmericanGreeting.SayHello()

  {

    Console.WriteLine("Hello");

  }

}

使用这种方式就可以解决命名冲突问题。在使用显示的接口山西ian方式时,需要注意一下几个问题:

  • 若显式实现接口,方法不能使用任何访问修饰符,显式实现的成员都默认为私有。
  • 显式实现的成员默认是私有的,所以这些成员都不能通过类的对象进行访问。正确的调用方法是把speaker对象显式地转换成对应的接口,通过接口来调用SayHello方法。

针对以上的两种方式:显式实现和隐式实现,下面针对两种实现的区别和使用场景进行总结:

  • 采用隐式接口实现时,类和接口都可以访问接口中的方法;而若采用显式接口实现方式,接口方法只能通过接口来完成访问,因此此时接口方法默认为私有。
  • 当类实现单个接口时,通常使用隐式接口实现方式,这样类的对象可以直接去访问接口方法。
  • 当类实现了多个接口,并且接口中包含相同的方法名称、参数和返回类型时,则应使用显式接口实现方式。即使没有相同的方法签名,在实现多个接口时,扔推荐使用显式的 方法,因为这样可以标识出哪个方法属于哪个接口。

 

4、接口与抽象类

这里主要是阐述一下两者的区别:

  • 抽象类使用abstract关键字进行定义,而接口使用interface进行定义;他们都不能进行实例化。
  • 抽象类中可以包含虚方法、非抽象方法和静态成员;但接口中不能包含虚方法和任何静态成员,并且接口中只能定义方法,不能有具体实现,方法的具体实现由实现类完成。
  • 抽象类不能实现多继承,接口则支持多继承。注意,从严格意义上说,类接触接口应该成为类实现接口。
  • 抽象类是对一类对象的抽象,继承于抽象类的类与抽象类为属于的关系;而类实现接口只是代表实现类具有接口声明的方法,是一种Can-DO的关系。所以一般接口后都带有able字段,表示“我能做”的意思。

上面的几点只是接口与抽象类之间差异的主要方法,它们还有很多的不同,大家可以参考一下别的书籍或者别的博客。

转载于:https://www.cnblogs.com/Helius/p/5348088.html

你可能感兴趣的文章
python_day18 Django表关系
查看>>
ElasticSearch添加mapping
查看>>
使用 IIS 在 Windows 上托管 ASP.NET Core
查看>>
UIStoryboard
查看>>
P3379 【模板】最近公共祖先(LCA)
查看>>
C# sqlserver 2008 连接字符串
查看>>
Bauxite Crushing Plant
查看>>
Hdu Can you find it?(二分答案)
查看>>
树的直径相关
查看>>
[vue]组件的创建(componet)和销毁(keep-alive缓存)和父子dom同步nextTick
查看>>
Spring从入门到精通(四)
查看>>
Qt Creator下载
查看>>
初等矩阵的左乘右乘与行列变换的关系
查看>>
SSM框架CRUD代码生成器
查看>>
RazorHelper.cs
查看>>
20190223 Hadoop生态圈,关于大数据
查看>>
nil Nil NULL NSNull 之间的区别
查看>>
xcode 拷贝新的ios image 进去以后 出现 the divices is locked
查看>>
转义字符
查看>>
strftime( )函数用法
查看>>