接口interface的知识在这一部分研究中尤为重要,因为接口实现了鸡链系统。对了 可能还牵扯到一些积分系统,让我们看看这一章中的内容。
接口可以被当做一种类来看待,他声明了子类中继承和要实现的内容。我们就以UDN中的接口文章来讲解这一章。
interface IWeapon; const FireRate=0.05; const FireCounter=3; function bool PrimaryFire(float Rate); function bool SecondFire(int Counter);
上边是一个武器类的接口,所有的武器类都得实现这个接口。里面有常量和函数,他约束了武器的一般行为。
pistol,机枪MachineGun,还是狙击SniperRifle。这些枪都有开火的一般行为和一些法定频率等属性。
关于接口的实现如下:
class Pistol extends UTWeapon implements(IWeapon); function bool PrimaryFire(flaot Rate) { if(Rate>class'IWeapon'.const.FireRate) return true; return false; } function bool SecondFire(int Counter) { if(Counter<class'IWeapon'.const.FireCounter) return true; return false; }
可以看到上边实现了接口中的内容,而且不用再重新定义常量。
这样做有一个好处,当我们的接口函数在实现的时候如果出错,编译器将会很快的告诉我们是接口实现出了问题。接口能让我们把一些类的一般属性都实现了,尽管每个类关于接口的函数实现都有各自的功能。但对外都是一致的,这就像USB一样。打印机,键盘,鼠标。
当然,接口也是可以继承的,前面的狙击枪SniperRifle。
Interface IZoomWeapon extends IWeapon; function bool ZoomedFire(flaot Rate,int FOV);
我们看一看狙击枪是怎么实现继承接口的。
class SniperRifle extends UTWeapon implements(IZoomedWeapon); function bool PrimaryFire(float Rate) { if(Rate>class'IWeapon'.const.FireRate) Rate=class'IWeapon'.const.FireRate; return false; } function bool SecondFire(int FireCount) { if(Rate>class'IWeapon'.const.FireCount) Counter=class'IWeapon'.const.FireCount; return false; } function bool ZoomedFire(float Rate,int FOV) { return false; }
每个类都要实现接口中的声明函数。
一个UDN中提到的很好问题,也许你觉得接口就是一种类,为什么多此一举?其实接口有自己的长处,当你在做子类的时候,你将一个函数拼错,编译器可能不会出错。但接口可以防止这种事件的发声。
尽管这样,接口还是很抽象,我们接下来学习Chicken中的接口。