面向接口编程

前言:

撸代码多年,但依然不懂编程语言中的接口是个什么鬼。为什么要用到它。不是说好的面向对象编程嘛。。哈哈哈。

原谅我是一个菜渣。这篇文章简单的描述了什么是面向接口编程。

    谈到接口的时候,通常会涉及以下几种含义。经常说一个库或者模块对外提供了某某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 );        // 输出:咯咯咯
  }
}

理解的还不够透彻。先到这里吧。以后再修改补充这篇文章。

原文出处:https://www.cnblogs.com/xiaohuochai/p/8051318.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

人工智能-肥鹅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值