MST

星途 面试题库

面试题:Ruby多态在模块混入(Mixin)场景下的实现

在Ruby中,有一个模块`Flyable`,包含`fly`方法。现有多个类如`Bird`、`Plane`都需要实现飞行的功能,即使用`Flyable`模块。但`Bird`的飞行实现依赖于翅膀挥动频率,`Plane`的飞行实现依赖于发动机功率。请详细说明如何通过模块混入实现多态,并给出完整代码示例展示不同类对`fly`方法的不同实现逻辑,同时说明如何确保混入模块后的类之间不会相互干扰。
36.9万 热度难度
编程语言Ruby

知识考点

AI 面试

面试题答案

一键面试
  1. 通过模块混入实现多态的原理
    • 在Ruby中,模块混入(include)允许一个类使用模块中定义的方法。通过在不同类中包含相同模块,并在类中重新定义模块中的方法,可以实现多态。即不同类对同一个模块方法有不同的实现逻辑。
  2. 确保混入模块后的类之间不会相互干扰
    • Ruby的模块和类是独立的命名空间。当一个类混入模块时,模块中的方法会被添加到类的方法集中。不同类对模块方法的实现是独立的,因为每个类都有自己的方法定义。只要在不同类中分别正确实现模块方法,就不会相互干扰。
  3. 完整代码示例
module Flyable
  def fly
    raise NotImplementedError, "Subclasses must implement #fly"
  end
end

class Bird
  include Flyable
  def initialize(wing_flap_frequency)
    @wing_flap_frequency = wing_flap_frequency
  end

  def fly
    puts "Bird is flying with wing flap frequency of #{@wing_flap_frequency} times per second."
  end
end

class Plane
  include Flyable
  def initialize(engine_power)
    @engine_power = engine_power
  end

  def fly
    puts "Plane is flying with engine power of #{@engine_power} horsepower."
  end
end

# 使用示例
bird = Bird.new(10)
bird.fly
plane = Plane.new(1000)
plane.fly

在上述代码中:

  • 首先定义了Flyable模块,其中fly方法抛出一个NotImplementedError,这是为了确保混入该模块的类必须实现fly方法。
  • Bird类和Plane类都混入了Flyable模块。Bird类在fly方法中使用翅膀挥动频率来描述飞行逻辑,Plane类在fly方法中使用发动机功率来描述飞行逻辑。
  • 最后创建BirdPlane的实例,并调用fly方法,展示不同类对fly方法的不同实现。由于类和模块的命名空间机制,BirdPlanefly方法的实现相互独立,不会相互干扰。