前言:
撸代码多年,但依然不懂编程语言中的接口是个什么鬼。为什么要用到它。不是说好的面向对象编程嘛。。哈哈哈。
原谅我是一个菜渣。这篇文章简单的描述了什么是面向接口编程。
谈到接口的时候,通常会涉及以下几种含义。经常说一个库或者模块对外提供了某某API接口。通过主动暴露的接口来通信,可以隐藏软件系统内部的工作细节。这也是最熟悉的第一种接口含义。第二种接口是一些语言提供的关键字,比如Java的interface。interface关键字可以产生一个完全抽象的类。这个完全抽象的类用来表示一种契约,专门负责建立类与类之间的联系。第三种接口即是谈论的“面向接口编程”中的接口,接口是对象能响应的请求的集合。
上面这段文字是网上摘抄的,但是我觉得他说的 第三种和第二种是一个东西。没区别。
鉴于网上的文章都是基于java语言的。那么我们这里也暂时先用java语言记录。因为我还不是特别理解。毕竟没做过啥大项目。
正式内容:
因为javascript并没有从语言层面提供对抽象类(Abstractclass)或者接口(interface)的支持,有必要从一门提供了抽象类和接口的语言开始,逐步了解“面向接口编程”在面向对象程序设计中的作用
有一个鸭子类Duck,还有一个让鸭子发出叫声的AnimalSound业务类(实现与业务分离),该类有一个makeSound方法,接收Duck类型的对象作为参数,代码如下:
public class Duck { // 鸭子类
public void makeSound(){
System.out.println( "嘎嘎嘎" );
}
}
public class AnimalSound {
public void makeSound( Duck duck ){ // (1) 只接受 Duck 类型的参数
duck.makeSound();
}
}
public class Test {
public static void main( String args[] ){
AnimalSound animalSound = new AnimalSound();
Duck duck = new Duck();
animalSound.makeSound( duck ); // 输出:嘎嘎嘎
}
}
目前已经可以顺利地让鸭子发出叫声。后来动物世界里又增加了一些鸡,现在想让鸡也叫唤起来,但发现这是一件不可能完成的事情,因为在上面这段代码的(1)处,即AnimalSound类的sound方法里,被规定只能接受Duck类型的对象作为参数:
public class Chicken { // 鸡类
public void makeSound(){
System.out.println( "咯咯咯" );
}
}
public class Test {
public static void main( String args[] ){
AnimalSound animalSound = new AnimalSound();
Chicken chicken = new Chicken();
animalSound.makeSound( chicken );
// 报错,animalSound.makeSound 只能接受 Duck 类型的参数
}
}
在享受静态语言类型检查带来的安全性的同时,也失去了一些编写代码的自由
静态类型语言通常设计为可以“向上转型”。当给一个类变量赋值时,这个变量的类型既可以使用这个类本身,也可以使用这个类的超类。就像看到天上有只麻雀,既可以说“一只麻雀在飞”,也可以说“一只鸟在飞”,甚至可以说成“一只动物在飞”。通过向上转型,对象的具体类型被隐藏在“超类型”身后。当对象类型之间的耦合关系被解除之后,这些对象才能在类型检查系统的监视下相互替换使用,这样才能看到对象的多态性
所以如果想让鸡也叫唤起来,必须先把duck对象和chicken对象都向上转型为它们的超类型Animal类,进行向上转型的工具就是抽象类或者interface。即将使用的是interface。先创建一个Animal接口:
public interface Animal{
abstract void makeSound();
}
然后让Duck类和Chicken类都继承自接口Animal:
public class Duck implements Animal{
public void makeSound() { // 重写 Animal 接口的 makeSound 抽象方法
System.out.println( "嘎嘎嘎" );
}
}
public class Chicken implements Animal{
public void makeSound() { // 重写 Animal 接口的 makeSound 抽象方法
System.out.println( "咯咯咯" );
}
}
现在剩下的就是让AnimalSound类的makeSound方法接收Animal类型的参数,而不是具体的Duck类型或者Chicken类型:
public class AnimalSound {
public void makeSound( Animal animal ){
animal.makeSound();
}
}
public class Test {
public static void main( String args[] ){
Animal duck = new Duck(); //向上转型
Animal chicken = new Chicken(); //向上转型
AnimalSound animalSound = new AnimalSound();
animalSound.makeSound( duck ); // 输出:嘎嘎嘎
animalSound.makeSound( chicken ); // 输出:咯咯咯
}
}
理解的还不够透彻。先到这里吧。以后再修改补充这篇文章。