接口编程——新手房

AE是基于COM技术的而构建的一些COM组件,关于COM是什么,大家不妨Google下,但是我在这里强调一点COM不是一种语言,COM 也不是一接口,更不是类,而是一种基于二进制组件的通信标准。在这篇博文的后面,我会附加一个我在学习Engine的时候收录的一些有关COM技术的文章。
使用AE,也就意味着使用里面的接口,那么什么是接口呢?在面向对象的编程中,我们都会接触到这个玩意儿,我们知道面向对象有三大特性封装,继承,多态,相信很多人在学习多态的时候,会接触接口。
接口可以用这样一句话来描述“接口就是包含一系列不被实现的方法.而把这些方法的实现交给继承它的类.”,这句话看起来很晦涩,没关系,我们通过下面一个例子说明我定义了一个接口IPeople
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. namespace InterfaceTest
  6. {
  7. interface IPeople
  8. {
  9. void gender();
  10. }
  11. }
复制代码

这个接口里面有一个性别的方法,这个只对方法进行了定义,而方法内却没有内容,也就是说,通过这个接口的这个gender方法,我们不能知道它到底干什么,但是要知道这个gender到底是干什么用的,那么就要看实现了这个方法的类。
同理我定义两个类,分别实现这个接口

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. namespace InterfaceTest
  6. {
  7. class Boy:IPeople
  8. {
  9. public void gender()
  10. {
  11. Console.WriteLine("I’m a boy.");
  12. }
  13. }
  14. }
复制代码


  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. namespace InterfaceTest
  6. {
  7. class Girl:IPeople
  8. {
  9. public void gender()
  10. {
  11. Console.WriteLine("I’m a girl.");

  12. }
  13. }
  14. }
复制代码


通过上面的两个类,我们就很清楚的看到这个方法的作用了,我们也可以看到一个接口可以被多个类实现。
我们运行一下这个,看一下效果

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. namespace InterfaceTest
  6. {
  7. class Program
  8. {
  9. static void Main(string[] args)
  10. {
  11. IPeople Person; // 声明接口变量
  12. Person = new Boy(); // 实例化,接口变量中存放对象的引用
  13. Person.gender(); // 这个调用的是Boy中的gender方法
  14. Person = new Girl(); // 实例化,接口变量中存放对象的引用
  15. Person.gender(); // 这个调用的是Gril中的gender方法
  16. Console.ReadLine();

  17. }
  18. }
  19. }
制代码

运行结果如下:

接口编程鈥斺斝率址 1.jpg
下载 (41.07 KB)
2011-12-4 21:14


我们知道一个类实现了接口,那么我们可以通过类调用方法,比如上面的Boy实现了 IPeople 接口,我们也可以这么做
  1. Boy pBoy= new Boy();
  2. pBoy.gender();
  3. Girl pGirl= new Girl();
  4. pGirl.gender();
复制代码


这个结果和上面是一模一样的,如何做到只让我们使用接口而不使用类呢?我们只要显示实现接口,我们以Girl为例,如下:
  1. class Girl:IPeople
  2. {
  3. #region IPeople 成员 显示实现
  4. void IPeople.gender()
  5. {
  6. Console.WriteLine("I’m a girl.");
  7. }
  8. #endregion
  9. }
复制代码


那么这个时候我们就不能通过下面的方式调用gerder这个方法了:
  1. Girl pGirl= new Girl();
  2. pGirl.gender();
复制代码


QI(Query Interface)

一个接口可以被多个类实现,而QI要解决的就是一个类实现多个接口的问题。在COM中,接口定义了方法,类实现了接口中定义的方法,而一个接口只能使用自己内部定义的方法,而不能越界,就好比一个班级一样,这个班级内有班长,有学习委员,有体育委员,每位干部各司其职,每一位干部负责自己职权范围之内的事情,各位干部相互协作,解决班级内的事情,这班级内的每一位干部就相当于一个接口,而这个班级就相当于实现了这些接口的类。当这个班级的一些事情需要班长处理的时候,我们就执行班长这个接口中定义的方法,当需要学习委员处理的话,我们再将执行权交给学习委员这个接口,这也就是接口之间的互相访问(Query Interface),通过这个我们大体上对QI有了感性上的认识,下面我们通过实例演示一下。
我定义了两个接口

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;

  5. namespace QITest
  6. {
  7. interface IFavoriteFood
  8. {
  9. void Food();
  10. }
  11. }


  12. using System;
  13. using System.Collections.Generic;
  14. using System.Linq;
  15. using System.Text;

  16. namespace QITest
  17. {
  18. interface IVoice
  19. {
  20. void Voice();
  21. }
  22. }
复制代码

然后定义了一个Cat的类实现这里面的方法

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;

  5. namespace QITest
  6. {
  7. class Cat:IFavoriteFood ,IVoice
  8. {
  9. public void Food()
  10. {
  11. Console.WriteLine("我喜欢的食物是老鼠.");

  12. }

  13. public void Voice()
  14. {
  15. Console.WriteLine("喵,喵,喵...");

  16. }
  17. }
  18. }
复制代码

这个Cat类的功能就是实现两个接口的方法,猫最喜欢的事物是老鼠,而他的声音是“喵,喵,喵”。
运行下
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;

  5. namespace QITest
  6. {
  7. class Program
  8. {
  9. static void Main(string[] args)
  10. {
  11. IVoice pVoice = new Cat();

  12. pVoice.Voice();//只能调用IVoice中定义的方法

  13. // pVoice.Food();这个就会报错,因为 IVoice 接口中没有这个方法的定义

  14. IFavoriteFood pFavoriteFood = pVoice as IFavoriteFood;

  15. pFavoriteFood.Food();//只能调用IFavoriteFood定义的方法

  16. Console.ReadLine();

  17. }
  18. }
  19. }
复制代码
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值