所以,我已經學習 Ruby 兩個多星期了,我在理解整個 OOP 方面遇到了一些問題。
在本課中,在最后的練習中,我們被要求創建一個 的超類vehicle并向其添加非特定行為,然后創建從它繼承的aMyCar和 aMyTruck子類,并有一個常量將它們分開。所以我確實喜歡這樣:
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方法,以便它回傳一個字串,該字串將說明它是哪種車輛以及其他資訊。現在,練習并沒有要求我們這樣做——事實上,他們定義了一個 to_s 方法MyCar,另一個以MyTruck“我的車...”或“我的卡車...”開頭,但我覺得這與DRY 原則。
問題是,Ruby 似乎不接受在超類方法中傳遞的子類變數。如果我使用#{VEHICLE_TYPE}它會拋出一個uninitialized constant Vehicle::VEHICLE_TYPE (NameError),如果我使用#{self.VEHICLE_TYPE}它會拋出一個undefined method 'VEHICLE_TYPE' for Vehicle:Class (NoMethodError)。
我的假設是否正確,Ruby 不接受超類中的子類變數?我怎樣才能以類似的方式解決這個問題?因為我想簡單地向initizalizefor 型別添加另一個引數,存盤在超類實體變數中并完成它,但我認為這不會滿足練習的目的。
請記住,我是新手!
提前致謝!
uj5u.com熱心網友回復:
這是正確的。超類不能使用 的快捷符號VEHICLE_TYPE來訪問您定義的常量。
當您想訪問定義在類之外的常量時,您可以使用限定名稱訪問它,例如:
Car::VEHICLE_TYPE
你已經非常接近你的self.VEHICLE_TYPE嘗試了。但是要為類似的東西提供通用替代品Car::,您需要使用self.class::.
所以你的to_s方法看起來像:
def to_s
"My #{self.class::VEHICLE_TYPE} is a #{self.model} #{self.year} of color #{self.color}."
end
只要每個可實體化的類都定義了該常量,這將起作用。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/368445.html
上一篇:django額外選擇到qs
