icon
面向对象编程

面向对象:封装、继承、多态

  1. ‌封装‌: 封装是指将数据(属性)和操作数据的方法(函数)捆绑在一起,形成一个对象。 它还涉及到对数据的访问控制,即限制外部对对象内部数据的直接访问,以保护数据的完整性和安全性。 通过封装,我们可以隐藏对象的内部实现细节,只暴露必要的接口给外部使用。
  2. 继承‌: 继承是面向对象编程中实现代码复用的一种重要机制。 它允许一个类(子类)继承另一个类(父类)的属性和方法。 通过继承,子类可以复用父类中已经定义好的代码,同时还可以添加新的属性和方法或者重写父类中的方法以实现特定的功能。 继承使得代码更加模块化,易于维护和扩展。
  3. 多态‌: 多态是指允许不同类的对象对同一消息作出响应,并根据各自的实现来执行。 多态性分为编译时多态性和运行时多态性。编译时多态性通常通过函数重载和运算符重载来实现,而运行时多态性则通过继承和虚函数来实现。 多态性使得我们可以使用统一的接口来调用不同对象的方法,从而提高了代码的灵活性和可扩展性。
  • 函数重写,子类重写父类方法
  • 鸭子类型。
class Duck {
  quack() {
    console.log("Quack!");
  }
}

class Person {
  quack() {
    console.log("I can quack like a duck!");
  }
}

function makeQuack(duckLike) {
  duckLike.quack();
}

makeQuack(new Duck());    // Quack!
makeQuack(new Person());  // I can quack like a duck!

makeQuack函数不关心参数的具体类型,只要它有quack方法即可。 这种多态性完全基于对象的行为,而不是类型。

  • 高阶函数实现多态
function greet(greetingFunction) {
  greetingFunction();
}

function englishGreet() {
  console.log("Hello!");
}

function spanishGreet() {
  console.log("Hola!");
}

greet(englishGreet); // Hello!
greet(spanishGreet); // Hola!

greet函数接受一个函数作为参数,根据传入的函数不同,行为也不同。

  • 多态的实际应用场景‌ ‌插件系统‌:不同插件实现相同的接口,主程序通过统一的接口调用插件功能。 ‌事件处理‌:不同事件对象可以触发同一事件监听器,但行为可能不同。 ‌策略模式‌:通过传入不同的策略函数,实现不同的算法行为。