Объект, как ожидается, будет своего рода классом - PullRequest
1 голос
/ 06 октября 2019

Вот что мне нужно сделать:

  1. Мне нужен этот атрибут "титульный", чтобы быть клиентом.

  2. В Conta. rb, во вставке 'conta.titular.nome, равный titular'

Я пытался использовать super (), чтобы сделать класс Cliente родительским для Conta. Но ничего не сработало, и я полностью потерян. Я не могу представить, как один атрибут из класса может быть видом другого. Я прочитал много уроков о наследовании, но ничего из этого не приблизилось. Надеюсь, кто-то может объяснить мне это.

Conta.rb

class Conta 
  attr_accessor :titular, :limite, :saldo, :numero

  def initialize(numero, titular, saldo, limite)
    @numero = numero
    @titular = titular
    @saldo = saldo
    @limite = limite
  end

  def kind_of(klass)
    Cliente >= klass
  end

  def sacar(valor)
    return false if valor > (@saldo + @limite)

    @saldo -= valor
    true
  end

  def depositar(valor)
    @saldo += valor
  end

  def no_limite?
    @saldo < 0
  end

  def ==(conta)
      conta.titular == titular &&
      conta.limite == limite &&
      conta.saldo == saldo &&
      conta.numero == numero
  end

  def transfere(conta_destino, valor_transferencia)
    return false unless sacar(valor_transferencia)
    conta_destino.depositar(valor_transferencia)
  end
end

Spec

describe Conta do
#1.
  it "titular deveria ser um Cliente" do
    conta = Conta.new('2303-2', 'José da Silva', 1000.10, 500)

    expect(conta.titular).to be_a(Cliente)
  end

#2.
  it "deveria conseguir criar um objeto do tipo Conta" do
    numero = "2303-2"
    titular = "José da Silva"
    saldo = 1000.10
    limite = 500
    conta = Conta.new(numero, titular, saldo, limite)

    expect(conta.numero).to eq numero
    expect(conta.titular.nome).to eq titular
    expect(conta.limite).to eq limite
    expect(conta.saldo).to eq saldo
  end

Cliente.rb

class Cliente
    attr_accessor :nome, :sobrenome, :cpf, :nome_completo, :tratamento
    def initialize(nome, sobrenome, cpf)
        @nome = nome
        @sobrenome = sobrenome
        @cpf = cpf
    end

    def nome_completo
        if @tratamento.nil?
            return @nome_completo = @nome + ' ' + @sobrenome
        else
            return @nome_completo = @tratamento + ' ' + @nome + ' ' + @sobrenome
        end
    end
end

Ошибка:

  1) Conta titular deveria ser um Cliente
     Failure/Error: expect(conta.titular).to be_a(Cliente)
       expected "José da Silva" to be a kind of Cliente
     # ./spec/conta_spec.rb:7:in `block (2 levels) in <top (required)>'

2) Conta deveria conseguir criar um objeto do tipo Conta
     Failure/Error: expect(conta.titular.nome).to eq titular

     NoMethodError:
       undefined method `nome' for "José da Silva":String
     # ./spec/conta_spec.rb:18:in `block (2 levels) in <top (required)>'

1 Ответ

3 голосов
/ 06 октября 2019

Вы можете создать новый объект Cliente и передать его как аргумент titular, определенный в Conta:

conta = Conta.new('2303-2', Cliente.new('José da Silva', nil, nil), 1000.10, 500)
p conta.kind_of(Cliente) # true

Вы можете изменить свой класс Conta, чтобы делегировать метод nome дляtitular:

require 'forwardable'

class Conta 
  extend Forwardable

  ...

  def kind_of(klass)
    titular.kind_of?(klass)
  end

  def_delegators :titular, :nome
end

p conta.nome # "José da Silva"

Кроме того, вы можете переопределить kind_of invoke kind_of? на titular, используя полученный аргумент klass.

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