继承问题。 NoMethodError:未定义的方法

时间:2018-12-11 23:37:40

标签: ruby inheritance multiple-inheritance

我正在做一个大学项目。该项目是关于游戏的(就像垄断)。这周,我们研究了继承,现在,我们必须在项目中使用它。儿童类的构造函数存在一些问题。

我有这个家长班:

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

这是一个孩子班:

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

最后一个孩子班:

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

父类有两种不同的显示方式,例如具有特定变量或其他不同形式(具有相同变量)的“ Calle”。 TipoSorpresa是带有“ Casilla”类型的枚举。 问题出在构造函数上。在其他类中,当我想初始化Calle对象或otraCasilla对象时,我使用

Calle.copia(···)
otraCasilla(···)

运行正常,但是当我要访问类元素时,编译器告诉我该元素不存在。这是错误的区域:

@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

谢谢您的时间,如果我的英语不好,很抱歉。

1 个答案:

答案 0 :(得分:0)

在您的copia方法中,您将返回self,但这是一个类方法,因此self引用了类本身。

相反,您想返回类的 instance 。我还没有看到完全以这种方式使用继承,但是我猜想当您调用super(casilla)时,它会调用顶级copia方法,该方法会在Casilla类中调用new。因此,您最终将获得一个Casilla实例。

我将从每个copia方法(和任何其他类方法)中删除所有超级调用,以使工作正常,然后将其干燥(删除重复项)。