转自:https://blog.csdn.net/seanbei/article/details/37812477
接口对于初学者来说是一个太抽象的东西。看了教材之后基本都是一个感觉:接口到底是用来干嘛的?书上讲声明接口,实现接口,并不难,难的是什么时候用接口呢?网上有几个非常通俗的讲解,很受益。再用自己的思路梳理一下,应该不算抄袭吧。
案例:猫狗叫
声明接口:
interface 接口-叫
{
方法-叫();
}
实现接口:
class 狗:接口-叫
{
方法-叫()
{
"汪汪";
}
}
class 猫:接口-叫
{
方法-叫()
{
"喵喵";
}
}
那么,使用的时候,就是
class 动物行为
{
main()
{
狗.方法-叫();
猫.方法-叫();
}
}
这时候肯定有人会想,为什么要这么复杂,直接定义一个类不就可以了?
像这样:
class 动物叫
{
狗()
{
"汪汪";
}
猫()
{
"喵喵";
}
}
class 动物行为
{
main()
{
动物叫.狗();
动物叫.猫();
}
}
确实没有问题!
那为什么还要用看起来很复杂的接口?答案就在下面。
现在要新加一只鸭子的叫,对比上下两种方式的差异。
对于使用了接口的方式,只需增加如下操作:
class 鸭:接口-叫
{
方法-叫()
{
"嘎嘎";
}
}
在“动物行为”的类里直接调用 鸭.方法-叫(); 即可。对其他的类不进行任何改动。
对于不使用接口的方式,先在“动物叫”的类里增加鸭叫的方法,然后再调用。
那么“动物叫”这个类是需要被随时修改的,这是一种不安全的做法。
当然,有人会说,不应该这样定义“动物叫”这个类,而是每个动物都定义成一个类,这样就可以单独增加鸭这个类了。我想说的是,这不就是使用接口的那个结构吗?这样做除了没有接口的声明,其他结构都一样了。
现在对动物行为的研究不仅限于叫,还有吃、喝、拉、撒等等,那么每个类里面都应该包含这些方法,这时候接口就体现了它存在的意义,一个极其重要的作用,就是规范每个类的方法。
只要是继承了接口的类,都包含了接口里面的方法。
那么,我再新加一个鸡的类,它需要哪些方法,都写在接口声明里面了,我只要逐一实现就好。
于是,我们说,接口是一种类与类之间的规范,一种协议!