Проблема с наследованием.NoMethodError: неопределенный метод - PullRequest
0 голосов
/ 12 декабря 2018

Я делаю университетский проект.Проект об игре (как монополия).На этой неделе мы изучали наследование и теперь нам нужно использовать его в проекте.У меня есть некоторые проблемы с конструкторами дочерних классов.

У меня есть родительский класс:

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» со специфической переменной или другими разными формами (с такими же переменными).ТипоСорпреса - это перечисление с типами "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 голосов
/ 12 декабря 2018

В вашем методе copia вы возвращаете self, но это метод класса, поэтому self относится к самому классу.

Вместо этого вы хотите вернуть экземпляр класса.Я не видел, чтобы наследование использовалось именно таким образом, но я думаю, что когда вы вызываете super(casilla), он вызывает метод верхнего уровня copia, который вызывает new внутри класса Casilla.Таким образом, вы получите в итоге экземпляр Casilla.

Я бы удалил все супер-вызовы из каждого метода copia (и любых других методов класса), чтобы все заработало, а затем СУХОЙ (удалил дубликаты) его впоследствии..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...