Problem with inheritance. NoMethodError: undefined method
Problem with inheritance. NoMethodError: undefined method
我正在做一个大学项目。该项目是关于游戏(如垄断)。这周,我们学习了继承,现在,我们要在项目中使用。 children class 构造器有一些问题。
我有这个 parent class:
class Casilla
attr_reader :numeroCasilla
attr_accessor :precioCompra
def initialize(numCas, coste)
@numeroCasilla = numCas
@precioCompra = coste
end
def self.copia(casilla)
self.new(casilla.numeroCasilla, casilla.precioCompra)
end
# Dejamos este método ya que no podemos modificar precioCompra desde calle
def setTitulo(ttl)
@precioCompra = ttl.precioCompra
end
def soyEdificable; end
def tengoPropietario; end
private :setTitulo
end
这是一个childclass:
class Calle < Casilla
attr_reader :titulo
attr_reader :tipo
# def initialize(casilla, ttl)
# copia(casilla,ttl)
# end
def self.copia(casilla,ttl)
super(casilla)
@titulo = ttl
@tipo = TipoCasilla::CALLE
self
end
def soyEdificable
salida = true
salida
end
def tengoPropietario
salida = @titulo.tengoPropietario();
salida
end
def setTitulo(ttl)
@titulo = ttl
super(ttl)
end
def propietarioEncarcelado
@titulo.propietarioEncarcelado
end
def asignarPropietario(jugador)
@titulo.propietario = jugador;
@titulo
end
def pagarAlquiler
@titulo.pagarAlquiler
end
private :setTitulo
end
最后一个childclass:
class OtraCasilla < Casilla
attr_reader :tipo
# def initialize(casilla, tp)
# copia(casilla)
# @tipo = tp
# end
def self.copia(casilla, tipo)
super(casilla)
@tipo = tipo
return self
end
def soyEdificable
salida = false
salida
end
def tengoPropietario
salida = false
salida
end
def to_s
puts super
puts " \n Tipo: #{@tipo} \n"
end
end
parent class 有两种不同的显示方式,例如带有特定变量的 "Calle" 或其他不同形式(具有相同变量)。 TipoSorpresa 是一个类型为 "Casilla" 的枚举。
问题出在构造函数上。在其他 class 中,当我想初始化 Calle object 或 otraCasilla object 时,我使用
Calle.copia(···)
otraCasilla(···)
运行 工作正常,但是当我想访问 class 元素时,编译器告诉我这个元素不存在。这是错误区域:
@casillas = Array.new
@casillas<< OtraCasilla.copia(Casilla.new(0, 0), TipoCasilla::SALIDA)
@casillas<< Calle.copia(Casilla.new(1, 500), TituloPropiedad.new("Av. de Andalucía", 500, 50, 20, 150, 250))
puts @casillas[1].titulo.nombre # I put this to check if the constructor is good
在最后一行,我们有这个错误:
NoMethodError: undefined method `titulo' for ModeloQytetet::Calle:Class
感谢您的宝贵时间,如果我的英语不好,请见谅。
在您的 copia
方法中,您正在 returning self
,但这是一个 class 方法,因此 self
指的是 class 本身。
相反,您想要 return class 的 实例 。我还没有看到以这种方式使用的继承,但我猜想当你调用 super(casilla)
时,它会调用顶级 copia
方法,该方法会在 Casilla [=] 中调用 new
25=]。所以你最终会得到一个 Casilla 实例。
我会从每个 copia
方法(以及任何其他 class 方法)中删除所有超级调用以使事情正常运行,然后 DRY(删除重复项)。
我正在做一个大学项目。该项目是关于游戏(如垄断)。这周,我们学习了继承,现在,我们要在项目中使用。 children class 构造器有一些问题。
我有这个 parent class:
class Casilla
attr_reader :numeroCasilla
attr_accessor :precioCompra
def initialize(numCas, coste)
@numeroCasilla = numCas
@precioCompra = coste
end
def self.copia(casilla)
self.new(casilla.numeroCasilla, casilla.precioCompra)
end
# Dejamos este método ya que no podemos modificar precioCompra desde calle
def setTitulo(ttl)
@precioCompra = ttl.precioCompra
end
def soyEdificable; end
def tengoPropietario; end
private :setTitulo
end
这是一个childclass:
class Calle < Casilla
attr_reader :titulo
attr_reader :tipo
# def initialize(casilla, ttl)
# copia(casilla,ttl)
# end
def self.copia(casilla,ttl)
super(casilla)
@titulo = ttl
@tipo = TipoCasilla::CALLE
self
end
def soyEdificable
salida = true
salida
end
def tengoPropietario
salida = @titulo.tengoPropietario();
salida
end
def setTitulo(ttl)
@titulo = ttl
super(ttl)
end
def propietarioEncarcelado
@titulo.propietarioEncarcelado
end
def asignarPropietario(jugador)
@titulo.propietario = jugador;
@titulo
end
def pagarAlquiler
@titulo.pagarAlquiler
end
private :setTitulo
end
最后一个childclass:
class OtraCasilla < Casilla
attr_reader :tipo
# def initialize(casilla, tp)
# copia(casilla)
# @tipo = tp
# end
def self.copia(casilla, tipo)
super(casilla)
@tipo = tipo
return self
end
def soyEdificable
salida = false
salida
end
def tengoPropietario
salida = false
salida
end
def to_s
puts super
puts " \n Tipo: #{@tipo} \n"
end
end
parent class 有两种不同的显示方式,例如带有特定变量的 "Calle" 或其他不同形式(具有相同变量)。 TipoSorpresa 是一个类型为 "Casilla" 的枚举。 问题出在构造函数上。在其他 class 中,当我想初始化 Calle object 或 otraCasilla object 时,我使用
Calle.copia(···)
otraCasilla(···)
运行 工作正常,但是当我想访问 class 元素时,编译器告诉我这个元素不存在。这是错误区域:
@casillas = Array.new
@casillas<< OtraCasilla.copia(Casilla.new(0, 0), TipoCasilla::SALIDA)
@casillas<< Calle.copia(Casilla.new(1, 500), TituloPropiedad.new("Av. de Andalucía", 500, 50, 20, 150, 250))
puts @casillas[1].titulo.nombre # I put this to check if the constructor is good
在最后一行,我们有这个错误:
NoMethodError: undefined method `titulo' for ModeloQytetet::Calle:Class
感谢您的宝贵时间,如果我的英语不好,请见谅。
在您的 copia
方法中,您正在 returning self
,但这是一个 class 方法,因此 self
指的是 class 本身。
相反,您想要 return class 的 实例 。我还没有看到以这种方式使用的继承,但我猜想当你调用 super(casilla)
时,它会调用顶级 copia
方法,该方法会在 Casilla [=] 中调用 new
25=]。所以你最终会得到一个 Casilla 实例。
我会从每个 copia
方法(以及任何其他 class 方法)中删除所有超级调用以使事情正常运行,然后 DRY(删除重复项)。