Я намагаюся зрозуміти спадковість:
class Car
@@wheels = 4
def wheel
@@wheels
end
end
class StretchLimo < Car
@@wheels = 6
def whee
@@wheels
end
def turn_on_television
end
end
Я створюю екземпляри деяких об’єктів так:
moe = Car.new
larry = StretchLimo.new
Коли я роблю moe.wheel
, Я отримав 6
, коли я чекаю 4
.
Підручник з Ruby, за яким я слідую, каже, що так і повинно бути 4
. Larry.whee
явно повинен повернутися 6
.
До речі, "wheel
"і"whee
"функції, які я додав, щоб я міг бачити значення. Чи може хтось пояснити, що тут не так?"
Відповіді:
1 для відповіді № 1Змінні класу в Ruby є дивно і заплутаний.
Ідіоматичний спосіб реалізувати те, що ви хочете:
class Car
def wheels
4
end
end
class StretchLimo < Car
def wheels
6
end
end
Car.new.wheels #=> 4
StretchLimo.new.wheels #=> 6
Що відбувається, так це змінні класу поділився між усіма екземплярами класу. Тому що StrechLimo
є підкласом Car
випадки StrechLimo
дивіться також цю змінну.
0 для відповіді № 2
@@
є змінною класу, тому вона є спільною для всіх об'єктів, створених з даного класу, і всіх похідних класів. Тому що Ruby інтерпретується, поки ви не створили екземпляр a StretchLimo
об'єкта, він не повинен дивитися на будь -який з StretchLimo
код, тому, якщо ви зробили наступне:
moe = Car.new
moe.wheel # should give 4
larry = StretchLimo.new
moe.wheel # should give 6
Тому що коли StretchLimo
отримує інтерпретацію, оновлює @@wheels
має бути змінна класу 6
. З іншого боку, якщо ви оголосили "колеса" лише з одним "@
"(@wheels
), це буде змінна екземпляра, специфічна для самого об'єкта, і ви отримаєте бажану поведінку.