【发布时间】:2022-01-05 16:11:44
【问题描述】:
所以,我已经学习 Ruby 两个多星期了,但我在理解整个 OOP 方面遇到了一些问题。
In this lesson,在最后的练习中,我们被要求创建一个vehicle的超类并为其添加非特定行为,然后创建一个MyCar和一个MyTruck继承自的子类它并且还有一个将它们分开的常数。所以我就这么做了:
class Vehicle
attr_accessor :color, :curr_speed
attr_reader :year, :model
def initialize(y, c, m)
@year = y
@color = c
@model = m
end
#SOME OTHER METHODS
def to_s
"My #{VEHICLE_TYPE} is a #{self.model} #{self.year} of color #{self.color}."
end
end
class MyCar < Vehicle
VEHICLE_TYPE = 'car'
end
class MyTruck < Vehicle
VEHICLE_TYPE = 'truck'
end
我还重新定义了to_s 方法,以便它返回一个字符串,该字符串将说明它是什么类型的车辆以及其他信息。现在,练习并没有要求我们这样做——事实上,他们为MyCar 和MyTruck 定义了一个to_s 方法,它以“我的车...”或“我的卡车...”开头,但是我觉得这违反了 DRY 原则。
问题是,Ruby 似乎不接受在超类方法中传递的子类变量。如果我使用#{VEHICLE_TYPE},它会抛出一个uninitialized constant Vehicle::VEHICLE_TYPE (NameError),如果我使用#{self.VEHICLE_TYPE},它会抛出一个undefined method 'VEHICLE_TYPE' for Vehicle:Class (NoMethodError)。
我的假设是否正确,即 Ruby 不接受超类中的子类变量?我怎么能以类似的方式解决这个问题?因为我想过简单地在initizalize 中添加另一个参数作为类型,存储在一个超类实例变量中并完成它,但我认为它不会达到练习的目的。
请记住,我是新手!
提前致谢!
【问题讨论】: