小R科技-WIFI机器人网·机器人创意工作室

 找回密码
 立即注册
查看: 8897|回复: 2

用CF游戏切枪来说明C#接口的用法和优势

[复制链接]
发表于 2017-12-5 16:47:17 | 显示全部楼层 |阅读模式
今天发一个技术干货帖,关于C#或其他面向对象语言中的“接口”的优势和用法。相信很多刚接触C#或JAVA等语言的朋友,面对“接口”这个特性始终云里雾里的,“接口”在大部分编程教材中都是这么描述的:
接口是指定一组函数成员而不实现成员的引用类型,其他类型-类和结构可以实现接口。
1. 接口是一个引用类型,通过接口可以实现多重继承。
2. C#中接口的成员不能有new、public、protected、internal、private等修饰符。
3. 接口中只能声明"抽象"成员(所以不能直接下一步对接口进行实例化(即不能使用new操作符声明一个接口的实例对 象)),而不能声明共有的域或者私有的成员变量。
4. 接口声明不包括数据成员,只能包含方法、属性、事件、索引等成员。
5. 接口名称一般都以“I”作为首字母(当然不这样声明也可以),这也是接口和类的一个区别之一。
6. 接口成员的访问级别是默认的(默认为public),所以在声明时不能再为接口成员指定任何访问修饰符,否则 编译器会报错。
7. 接口成员不能有static、abstract、override、virtual修饰符,使用new修饰符不会报错,但会给出警告说不需要关键字new。
8. 在声明接口成员的时候,不准为接口成员编写具体的可执行代码,也就是说,只要在对接口进行声明时指明接口的成员名称和参数就可以了。
9. 接口一旦被实现,实现类必须实现接口中的所有成员,除非实现类本身是抽象类(通过具体的可执行代码实现接口抽象成员的操作)。

看完如上简介,你肯定会说:这是什么鬼???没错,当年我也无法理解,你说好好的写一个函数就行了,为什么还要搞个接口,还只是“声明函数”,又不能“实现”,有什么用呢?
好的,今天,我们以一个实例来体现接口的优势。

假设,我们要写一个类似于CF,CS的竞技对战游戏,这个游戏中,我们可以通过键盘切换3种武器,按数字键1是狙击枪(sniperRifle),按数字键2是火箭筒(bazooka),按数字键3是导弹(missile)。
同时,这3种武器都有各自的弹药量,每使用一次,弹药量减1。我们先用传统的思维去实现这个开火过程。
-------------------------------------------------传统方式实现------------------------------------------------------------------------------------
首先我们要定义三个类来代表这三种武器:
class SniperRifle{
    int count=10;//弹药量
}//狙击枪
class Bazooka{
    int count=10;//弹药量
}//火箭筒
class Missile{
    int count=10;//弹药量
}//导弹

程序开始时,肯定是要先把这三种武器实例化的。
SniperRifle sniperRifle=new SniperRifle();
Bazooka bazooka= new Bazooka();
Missile missile=new Missile();
至此,我们有了三种实实在在的武器在手里了。
在这里,我们需要定义一个变量来表征当前的武器类型,WeaponType等于1代表狙击枪,WeaponType等于2代表火箭筒,WeaponType等于3代表导弹,当玩家按下键盘时,根据按下的情况来改变标志位,所以得这么写:
int WeaponType=0;
KeyBoardPress()
{
    if(KeyCode==1)//当前按下了键盘的数字1,当前武器是狙击枪
    {
       WeaponType=1;
    }
    else if(KeyCode==2)//当前按下了键盘的数字2,当前武器是火箭筒
   {
     WeaponType=2;
   }
   else if(KeyCode==3)//当前按下了键盘的数字3,当前武器是导弹
  {
     WeaponType=3;
  }
}
好,假设点击一次鼠标左键为开火,开火的函数为Mouse_Click()
那么,当点击一次鼠标左键,我们应该先判断当前的武器是什么类型,然后再把武器里面的弹药减1.

Mouse_Click()
{
   if(WeaponType==1)
   {
        sniperRifle.count=sniperRifle.count-1;   //根据当前标志位判断,是狙击枪,所以狙击枪的弹药数减1
   }
   else  if(WeaponType==2)
   {
        bazooka.count=bazooka.count-1;  //根据当前标志位判断,是火箭筒,所以火箭筒的弹药数减1
   }
   else  if(WeaponType==3)
   {
        missile.count=missile.count-1;  //根据当前标志位判断,是导弹,所以导弹的弹药数减1
   }

}

OK,如上就是传统的方式实现的切换武器和开火时弹药减少的逻辑。那么如果我们用接口的方式去实现,会不会更简单呢?来看看:
-------------------------------------------------接口方式实现------------------------------------------------------------------------------------
首先定义一个接口,叫做IWeapons,内容如下:
interface IWeapons
{

       int count    //返回或设置弹药数量
        {
            get;
            set;
        }

}

同样的,我们要定义三个类来代表这三种武器,但是这三个武器都要和IWeapon这个接口关联,所以这么写:
class SniperRifle:IWeapons{
    int count=10;//弹药量
}//狙击枪

class Bazooka : IWeapons{
    int count=10;//弹药量
}//火箭筒

class Missile : IWeapons{
    int count=10;//弹药量
}//导弹

实例化三种武器:
SniperRifle sniperRifle=new SniperRifle();
Bazooka bazooka= new Bazooka();
Missile missile=new Missile();

接着在程序一开始声明这个武器接口:
private IWeapons Weapons;
接下来,当按下键盘数字键切换武器时,我们把不同的武器实例赋予这个接口。
KeyBoardPress()
{

   if(KeyCode==1)//当前按下了键盘的数字1,当前武器是狙击枪
    {
       Weapons=sniperRifle;
    }
    else if(KeyCode==2)//当前按下了键盘的数字2,当前武器是火箭筒
   {
     Weapons=bazooka;
   }
   else if(KeyCode==3)//当前按下了键盘的数字3,当前武器是导弹
   {
     Weapons=missile;
   }

}

现在要开火了!
Mouse_Click()
{
    Weapons.count=Weapons.count-1;  //当前武器的弹药减1
}
什么??这么简单一句代码?开火时我只需要执行这句话就行了??不需要判断当前持有的武器类型吗??——回答是:“确实如此”。

对比一下,大家看到了吧?当不使用接口来实现时,每一次开火我们都得重新判断当前持有的武器是什么,然后再执行减弹药的操作,假设这个武器种类很多,武器的使用方法也好几种,那么你的代码逻辑复杂得会让你酸爽无比!但是如果你使用了接口,只需要在开火的函数里面写一句话:“武器的弹药减1”,就行了!至于具体是哪种武器的弹药要减1,你不用关心,程序会根据当前你接口里面的实际武器类型来减去相应的武器弹药量。这样你的代码就会变得简洁清爽,逻辑清晰。

至此,我用一个实例来给大家说明了接口的好处,相信看完这个就比较容易理解接口的作用了,在C#程序开发过程中,如果涉及多种类别相似的对象需要来回反复切换的,使用接口是最好不过的选择,它可以大大降低你的代码复杂度。

(本文代码部分使用的是伪代码,可能和C#实际语法略有出入,仅供理解参考)

by liuviking








回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

新品特惠推荐上一条 /2 下一条

QQ|QQ技术咨询1|QQ技术咨询2|商务合作微信1:xiaorgeek001|商务合作微信2:XiaoRGEEK|诚聘英才|Archiver|手机版|小R科技-WIFI机器人网·机器人创意工作室 ( 粤ICP备15000788号-6 )

GMT+8, 2024-11-26 09:06 , Processed in 1.088751 second(s), 22 queries .

Powered by XiaoR GEEK X3.4

© 2014-2021 XiaoR GEEK

快速回复 返回顶部 返回列表