Ruby类关系:如何使用其他类的方法和对象?

时间:2014-11-03 19:55:39

标签: ruby class inheritance methods

感谢您查看我的问题! :)

我对使用Ruby编程很新,而且我很难理解如何在我的代码中实现类,并让它们相互继承方法和变量。

我有一个类LightBulb,看起来像这样:

class LightBulb
  def initialize( watts, on )
    @watts = watts
    @on = on
  end

  # accessor methods
  def watts
    @watts
  end

  def on
    @on
  end

  # other methods
  def turnon
    @on = true
  end

  def turnoff
    @on = false
  end

  def to_s
    "#{@watts}-#{@on}"
  end
end

以及与该类一起使用的驱动程序:

# a lit, 30-watt bulb

b = LightBulb.new( 30, false )
b.turnon( )
Bulb    

# a 50-watt bulb

fiftyWatt = LightBulb.new( 50, false )
fiftyWatt.turnoff( )

...我正在尝试创建一个具有LightBulb并在不同时间使用它的Lamp类。我知道在继承树图上,它们应该是彼此相邻的(即LightBulb - Lamp,而不是LightBulb< - Lamp),所以我不知道我是否应该使用<继承运算符。 这是Lamp类所需的基本结构:

Lamp ( string make, string model, double cost, int watts )
-- accessors
string make( ) 
string model( ) 
-- methods
void turnon( ) # turn on the bulb
void turnoff( ) # turn off the bulb
--class members
string make
string model
double cost
LightBulb bulb

我如何在Lamp类中使用LightBulb类中的turnon()和turnoff()方法以及灯泡对象?

到目前为止,这是我对Lamp的看法,但我确信大部分内容都不正确:

class Lamp
    attr_accessor :watts
    def initialize(make, model, cost, watts)
        @make = make
        @model = model
        @cost = cost
        @watts = LightBulb.new(:watts)
    end

    def make
        @make
    end

    def model
        @model
    end

    def cost
        @cost
    end
end

2 个答案:

答案 0 :(得分:3)

你绝对不需要继承。你正在组成这些物体,一盏灯有一个LightBulb。您已经关闭,而您真正需要做的就是调用LightBulb上您丢失的方法:

class Lamp

  def initialize(make, model, cost, watts)
    @make = make
    @model = model
    @cost = cost
    @bulb = LightBulb.new(watts, false)
  end

  # ... 

  def turnon
    @bulb.turnon
  end

  def turnoff
    @bulb.turnoff
  end

end

所以我将@watts更改为@bulb,并删除了:watts符号,因为您确实需要传递传入的watts值。如果您&# 39;感兴趣,here is some more information on symbols

答案 1 :(得分:2)

在面向对象的术语中,这可以通过委派这些方法来完成:

class Lamp
  def turnon
    @lightbulb.turnof
  end

  def turnoff
    @lightbulb.turnoff
  end
end

这些传递方法在Ruby代码中相当常见,您需要将一个对象包装在另一个对象中。

如果您有更多的冒险精神,还有Forwardable模块。

从面向对象的设计角度来看,我更关注这里的责任链。例如,当灯泡具有关/开状态时,灯本身充当其“控制器”。你是对的,这不是继承的情况,而是封装。