感谢您查看我的问题! :)
我对使用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
答案 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模块。
从面向对象的设计角度来看,我更关注这里的责任链。例如,当灯泡具有关/开状态时,灯本身充当其“控制器”。你是对的,这不是继承的情况,而是封装。