接口与显式实现接口

鸭子是一种鸟,会游泳,同时又是一种食物。

C# 中所有的类都只能有一个父类,C#引入了接口(interface)这一概念,并规定“一个类可以实现多个接口”。

关键字interface 用于定义接口。

//定义两个接口
public interface ISwim
{
  void Swim();
}
public interface IFood
{
  void Cook();
}

接口可以看成是一种“纯”的抽象类,它的所有方法都是抽象方法。抽象类定义了对象所属的类别,而接口实际上定义了一种对象应具有的行为特性。

然后用与继承相同的语法定义一个类实现某些接口:

//定义一个抽象类
public abstract class Bird
{
public abstract void Fly();
}
//继承自一个抽象类,实现两个接口
public class Duck : Bird, IFood, ISwim
{
  //实现ISwim接口

  public void Swim()
  {
    Console.WriteLine("是鸭子就会游泳");
  }
  //实现IFood接口
  public void Cook()
  {
    Console.WriteLine("鸭子经常被烧烤,北京烤鸭就很有名");
  }
  //实现抽象类Bird中的抽象方法
  public override void Fly()
  {
    Console.WriteLine("只有野鸭才会飞");
  }
}

可按以下公式使用接口:
接口类型名 变量名=new 实现了接口的类型名();

示例代码如下:
static void Main(string[] args)
{
  Duck d = new Duck();
  //Duck对象d可以使用3种方法:
  //1.自身定义的;
  //2.父类定义的
  //3.接口定义的
  d.Fly();//输出"只有野鸭才会飞"
  d.Cook();//输出"鸭子经常被烧烤,北京烤鸭就很有名"
  d.Swim();//输出"是鸭子就会游泳"
 
  Bird b = d;//将子类(Duck)对象赋给基类变量
  b.Fly(); //现在只能使用基类定义的Fly()方法,//输出"只有野鸭才会飞"
  ISwim s = d; //将Duck对象赋给ISwin接口变量
  s.Swim();//现在只能使用接口定义的Swim()方法,//输出"是鸭子就会游泳"
  IFood f = d; //将Duck对象赋给另一个实现的接口IFood接口变量

  f.Cook(); //现在只能使用接口定义的Cook()方法,//输出"鸭子经常被烧烤,北京烤鸭就很有名"
}
请读者仔细地阅读上述代码的注释,由于Duck 类继承自抽象基类Bird,又实现了ISwim和IFood 两个接口,所以,Duck 对象拥有这三者所定义的所有方法,并且可以赋值给这三种类型的变量。
需要注意的是,虽然程序中始终都只有一个Duck 对象,但将其赋值给不同类型的变量后,其可以使用的方法是不一样的。


上面讲到,某个类可以实现多个接口,当创建一个此类的对象之后,通过引用这个对象的对象变量可以访问其所有的公有方法(包括类自身的公有方法以及由接口定义的公有方法)。在这种情况下,根本分不清哪些方法是由接口定义的,哪些是由类自己定义的。C#提供了一种“显式接口”实现机制,可以区分开这两种情况,一个示例代码如下:
interface IMyInterface
{
  void func();
}


public class A:IMyInterface
{
  void IMyInterface.func()
  {
    //……
  }
  public void func2()
  {
    //……
  }
}
请注意在方法func 前的接口名称IMyInterface,这就是C#对接口IMyInterface 的显式实现方式。
当类A 显式实现接口IMyInterface 之后,只能以下面这种方式访问接口定义的方法:
IMyInterface a = new A();
a.func();
以下代码将不能通过编译:
A a = new A();
a.func();
由此得到一个结论:
如果一个类显式实现某个接口,则只能以此接口类型(即IMyInterface)的变量(即a)为媒介调用此接口所定义的方法,而不允许通过类的对象变量直接调用。
或者这样说:被显式实现的接口方法只能通过接口实例访问,而不能通过类实例直接访问。

个人理解为,在类中被显式实现的接口方法相当于在接口内定义的方法,但是只能在类里这个位置定义。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值