/ / Рубін та спадковість - рубін, клас, спадковість

Рубін і спадщина - рубіни, клас, спадщина

Я намагаюся зрозуміти спадковість:

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), це буде змінна екземпляра, специфічна для самого об'єкта, і ви отримаєте бажану поведінку.