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(删除重复项)。