Eu estou tentando entender a herança:
class Car
@@wheels = 4
def wheel
@@wheels
end
end
class StretchLimo < Car
@@wheels = 6
def whee
@@wheels
end
def turn_on_television
end
end
Eu instanciamos alguns objetos assim:
moe = Car.new
larry = StretchLimo.new
Quando eu faço moe.wheel
, Eu recebo 6
quando estou esperando 4
.
O tutorial sobre Ruby que estou seguindo diz que deveria ser 4
. Larry.whee
obviamente deveria retornar 6
.
A propósito, o "wheel
"e"whee
"funções adicionadas para que eu pudesse ver os valores. Alguém pode explicar o que há de errado aqui?
Respostas:
1 para resposta № 1Variáveis de classe no Ruby são estranho e confuso.
Uma maneira idiomática de implementar o que você deseja é:
class Car
def wheels
4
end
end
class StretchLimo < Car
def wheels
6
end
end
Car.new.wheels #=> 4
StretchLimo.new.wheels #=> 6
O que está acontecendo é que as variáveis de classe são compartilhado entre todas as instâncias de uma classe. Porque StrechLimo
é uma subclasse de Car
instâncias de StrechLimo
veja também esta variável.
0 para resposta № 2
@@
é uma variável de classe e, portanto, é compartilhada entre todos os objetos instanciados de uma determinada classe e de todas as classes derivadas. Como Ruby é interpretado, até você instanciar um StretchLimo
objeto, ele não deve olhar para nenhum dos StretchLimo
código, portanto, se você fez o seguinte:
moe = Car.new
moe.wheel # should give 4
larry = StretchLimo.new
moe.wheel # should give 6
Porque quando o StretchLimo
é interpretado atualiza o @@wheels
variável de classe a ser 6
. Por outro lado, se você declarou "rodas" com apenas uma "@
"(@wheels
), seria uma variável de instância específica para o próprio objeto e você obteria seu comportamento preferido.