C#接口归纳总结实例详解

2019-12-30 17:16:03于丽

接口的继承:

接口继承和类继承不同:首先,类继承不仅是说明继承,而且也是实现继承;而接口继承只是说明继承。

也就是说,派生类可以继承基类的方法实现,而派生的接口只继承了父接口的成员方法说明,而没有继承父接口的实现,

其次,C#中类继承只允许单继承,但是接口继承允许多继承,一个子接口可以有多个父接口。

接口可以从零或多个接口中继承。从多个接口中继承时,用":"后跟被继承的接口名字,多个接口名之间用","分割。

被继承的接口应该是可以访问得到的,比如从private 类型或internal 类型的接口中继承就是不允许的。

接口不允许直接或间接地从自身继承。和类的继承相似,接口的继承也形成接口之间的层次结构。


interface IProgram
{
 void Fun();
}
interface IAProgram:IProgram
{ 
}
class Program : IAProgram
{
 void IProgram.Fun()
 {
  Console.WriteLine("I am IProgram Fun.");
 }
 staticvoid Main(string[] args)
 {
  Program pro =new Program();
  ((IAProgram)pro).Fun();
  Console.Read();
 }
}

接口的覆盖:

由于接口的实现没有方法体,抽象方法也没有方法体,那么当我们在接口的实现方法里调用抽象方法时,会如何执行呢?


 interface IProgram
 {
  void Fun();
 }
 abstractclass AProgram : IProgram
 {
  publicabstractvoid AFun();
  void IProgram.Fun()
  {
   AFun();
  }
 }
 class Program:AProgram
 {
  publicoverridevoid AFun()
  {
   Console.WriteLine("I am AProgram.");
  }
  staticvoid Main(string[] args)
  {
   IProgram pro =new Program();
   pro.Fun();
   Console.Read();
  }
 }
//结果:I am Aprogram.

通过断点,可以看到,当执行pro.Fun();时,首先会跳到接口的实现方法里,然后去调用抽象函数的实现方法,当抽象函数的方法实现后,再回到接口的实现方法,直到执行完成。

当我们在实现接口的方法里调用虚函数呢?


interface IProgram
{
 void Fun();
}
class AProgram : IProgram
{
 publicvirtualvoid AFun() //注意这里是虚函数
 {
  Console.WriteLine("I am virtual AFun.");
 }
 void IProgram.Fun()
 {
  AFun();
 }
}
class Program:AProgram
{
 publicoverridevoid AFun() //这里是Override重写
 {
  Console.WriteLine("I am override AFun.");
 }
 staticvoid Main(string[] args)
 {
  IProgram pro =new Program();
  pro.Fun();
  Console.Read();
 }
}

这时,我们发现,执行的顺序和上一个例子是相同的。所以结果为:I am override AFun.

由此,我们可以继续联想,当我们把override关键字,换成new呢?是不是也是同样的结果,还是和我们以前讲的例子一样,是隐藏呢?

我们把上面的例子进行改进: