AE是基于COM技术的而构建的一些COM组件,关于COM是什么,大家不妨Google下,但是我在这里强调一点COM不是一种语言,COM 也不是一接口,更不是类,而是一种基于二进制组件的通信标准。在这篇博文的后面,我会附加一个我在学习Engine的时候收录的一些有关COM技术的文章。
使用AE,也就意味着使用里面的接口,那么什么是接口呢?在面向对象的编程中,我们都会接触到这个玩意儿,我们知道面向对象有三大特性封装,继承,多态,相信很多人在学习多态的时候,会接触接口。
接口可以用这样一句话来描述“接口就是包含一系列不被实现的方法.而把这些方法的实现交给继承它的类.”,这句话看起来很晦涩,没关系,我们通过下面一个例子说明我定义了一个接口IPeople
复制代码
这个接口里面有一个性别的方法,这个只对方法进行了定义,而方法内却没有内容,也就是说,通过这个接口的这个gender方法,我们不能知道它到底干什么,但是要知道这个gender到底是干什么用的,那么就要看实现了这个方法的类。
同理我定义两个类,分别实现这个接口
复制代码
复制代码
通过上面的两个类,我们就很清楚的看到这个方法的作用了,我们也可以看到一个接口可以被多个类实现。
我们运行一下这个,看一下效果
复制代码
运行结果如下:
我们知道一个类实现了接口,那么我们可以通过类调用方法,比如上面的Boy实现了 IPeople 接口,我们也可以这么做
复制代码
这个结果和上面是一模一样的,如何做到只让我们使用接口而不使用类呢?我们只要显示实现接口,我们以Girl为例,如下:
复制代码
那么这个时候我们就不能通过下面的方式调用gerder这个方法了:
复制代码
QI(Query Interface)
一个接口可以被多个类实现,而QI要解决的就是一个类实现多个接口的问题。在COM中,接口定义了方法,类实现了接口中定义的方法,而一个接口只能使用自己内部定义的方法,而不能越界,就好比一个班级一样,这个班级内有班长,有学习委员,有体育委员,每位干部各司其职,每一位干部负责自己职权范围之内的事情,各位干部相互协作,解决班级内的事情,这班级内的每一位干部就相当于一个接口,而这个班级就相当于实现了这些接口的类。当这个班级的一些事情需要班长处理的时候,我们就执行班长这个接口中定义的方法,当需要学习委员处理的话,我们再将执行权交给学习委员这个接口,这也就是接口之间的互相访问(Query Interface),通过这个我们大体上对QI有了感性上的认识,下面我们通过实例演示一下。
我定义了两个接口
复制代码
然后定义了一个Cat的类实现这里面的方法
复制代码
这个Cat类的功能就是实现两个接口的方法,猫最喜欢的事物是老鼠,而他的声音是“喵,喵,喵”。
运行下
复制代码
使用AE,也就意味着使用里面的接口,那么什么是接口呢?在面向对象的编程中,我们都会接触到这个玩意儿,我们知道面向对象有三大特性封装,继承,多态,相信很多人在学习多态的时候,会接触接口。
接口可以用这样一句话来描述“接口就是包含一系列不被实现的方法.而把这些方法的实现交给继承它的类.”,这句话看起来很晦涩,没关系,我们通过下面一个例子说明我定义了一个接口IPeople
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- namespace InterfaceTest
- {
- interface IPeople
- {
- void gender();
- }
- }
这个接口里面有一个性别的方法,这个只对方法进行了定义,而方法内却没有内容,也就是说,通过这个接口的这个gender方法,我们不能知道它到底干什么,但是要知道这个gender到底是干什么用的,那么就要看实现了这个方法的类。
同理我定义两个类,分别实现这个接口
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- namespace InterfaceTest
- {
- class Boy:IPeople
- {
- public void gender()
- {
- Console.WriteLine("I’m a boy.");
- }
- }
- }
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- namespace InterfaceTest
- {
- class Girl:IPeople
- {
- public void gender()
- {
- Console.WriteLine("I’m a girl.");
- }
- }
- }
通过上面的两个类,我们就很清楚的看到这个方法的作用了,我们也可以看到一个接口可以被多个类实现。
我们运行一下这个,看一下效果
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- namespace InterfaceTest
- {
- class Program
- {
- static void Main(string[] args)
- {
- IPeople Person; // 声明接口变量
- Person = new Boy(); // 实例化,接口变量中存放对象的引用
- Person.gender(); // 这个调用的是Boy中的gender方法
- Person = new Girl(); // 实例化,接口变量中存放对象的引用
- Person.gender(); // 这个调用的是Gril中的gender方法
- Console.ReadLine();
- }
- }
- }
运行结果如下:
![接口编程鈥斺斝率址 接口编程鈥斺斝率址](https://i-blog.csdnimg.cn/blog_migrate/a4c26d1e5885305701be709a3d33442f.gif)
![接口编程鈥斺斝率址 1.jpg](https://i-blog.csdnimg.cn/blog_migrate/a4c26d1e5885305701be709a3d33442f.gif)
我们知道一个类实现了接口,那么我们可以通过类调用方法,比如上面的Boy实现了 IPeople 接口,我们也可以这么做
- Boy pBoy= new Boy();
- pBoy.gender();
- Girl pGirl= new Girl();
- pGirl.gender();
这个结果和上面是一模一样的,如何做到只让我们使用接口而不使用类呢?我们只要显示实现接口,我们以Girl为例,如下:
- class Girl:IPeople
- {
- #region IPeople 成员 显示实现
- void IPeople.gender()
- {
- Console.WriteLine("I’m a girl.");
- }
- #endregion
- }
那么这个时候我们就不能通过下面的方式调用gerder这个方法了:
- Girl pGirl= new Girl();
- pGirl.gender();
QI(Query Interface)
一个接口可以被多个类实现,而QI要解决的就是一个类实现多个接口的问题。在COM中,接口定义了方法,类实现了接口中定义的方法,而一个接口只能使用自己内部定义的方法,而不能越界,就好比一个班级一样,这个班级内有班长,有学习委员,有体育委员,每位干部各司其职,每一位干部负责自己职权范围之内的事情,各位干部相互协作,解决班级内的事情,这班级内的每一位干部就相当于一个接口,而这个班级就相当于实现了这些接口的类。当这个班级的一些事情需要班长处理的时候,我们就执行班长这个接口中定义的方法,当需要学习委员处理的话,我们再将执行权交给学习委员这个接口,这也就是接口之间的互相访问(Query Interface),通过这个我们大体上对QI有了感性上的认识,下面我们通过实例演示一下。
我定义了两个接口
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- namespace QITest
- {
- interface IFavoriteFood
- {
- void Food();
- }
- }
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- namespace QITest
- {
- interface IVoice
- {
- void Voice();
- }
- }
然后定义了一个Cat的类实现这里面的方法
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- namespace QITest
- {
- class Cat:IFavoriteFood ,IVoice
- {
- public void Food()
- {
- Console.WriteLine("我喜欢的食物是老鼠.");
- }
- public void Voice()
- {
- Console.WriteLine("喵,喵,喵...");
- }
- }
- }
这个Cat类的功能就是实现两个接口的方法,猫最喜欢的事物是老鼠,而他的声音是“喵,喵,喵”。
运行下
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- namespace QITest
- {
- class Program
- {
- static void Main(string[] args)
- {
- IVoice pVoice = new Cat();
- pVoice.Voice();//只能调用IVoice中定义的方法
- // pVoice.Food();这个就会报错,因为 IVoice 接口中没有这个方法的定义
- IFavoriteFood pFavoriteFood = pVoice as IFavoriteFood;
- pFavoriteFood.Food();//只能调用IFavoriteFood定义的方法
- Console.ReadLine();
- }
- }
- }