首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >继承的问题。NoMethodError:未定义的方法

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

Stack Overflow用户
提问于 2018-12-12 07:37:40
回答 1查看 476关注 0票数 0

我在做一个大学项目。这个项目是关于一个游戏(就像一个垄断游戏)。本周,我们学习了继承,现在,我们必须在项目中使用。我对子类构造器有一些问题。

我有这样一个父类:

代码语言:javascript
复制
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

这是一个子类:

代码语言:javascript
复制
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

最后一个子类:

代码语言:javascript
复制
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对象时,我使用

代码语言:javascript
复制
Calle.copia(···)
otraCasilla(···)

运行正常,但是当我想访问一个class元素时,编译器告诉我这个元素不存在。这是错误区域:

代码语言:javascript
复制
@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

在最后一行,我们有这样的错误:

代码语言:javascript
复制
NoMethodError: undefined method `titulo' for ModeloQytetet::Calle:Class

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-12 08:10:42

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

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53734001

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档