/ / Ruby e herança - ruby, classe, herança

Ruby e Herança - ruby, classe, herança

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 6quando 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 № 1

Variá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.