Ruby 对象应是类的一种

Ruby 对象应是类的一种,ruby,Ruby,以下是我需要做的: 我需要这个属性名义上是一个客户类型 在Conta.rb中,插入“Conta.titular.nome等于titular” 我尝试过使用super,使该类客户成为Conta的家长。 但是什么都没用,我完全迷路了。 我无法想象一个类中的一个属性怎么会是另一个属性。 我读了很多关于继承的教程,但没有一本能与之相提并论。希望有人能给我解释一下 续 class Conta attr_accessor :titular, :limite, :saldo, :numero de

以下是我需要做的:

我需要这个属性名义上是一个客户类型

在Conta.rb中,插入“Conta.titular.nome等于titular”

我尝试过使用super,使该类客户成为Conta的家长。 但是什么都没用,我完全迷路了。 我无法想象一个类中的一个属性怎么会是另一个属性。 我读了很多关于继承的教程,但没有一本能与之相提并论。希望有人能给我解释一下

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
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)>'

您可以创建一个新的Cliente对象,并将其作为Conta中定义的名义参数传递:

您可以修改Conta类,将方法nome委托给titular:


此外,您还可以重新定义的种类调用的种类?使用收到的klass参数进行有名无实的传递。

您可以创建一个新的Cliente对象,并将其作为Conta中定义的有名无实的参数传递:

您可以修改Conta类,将方法nome委托给titular:

此外,您还可以重新定义的种类调用的种类?使用收到的klass参数进行有名无实的操作。

您应该创建一个新的Cliente对象,然后将其作为有名无实的对象传递。Conta.new'2303-2',Cliente.new'Joséda Silva',nil,nil,1000.10500。您应该创建一个新的Cliente对象,然后将其作为名义对象传递。续:新“2303-2”,客户。新“Joséda Silva”,无,无,1000.10500。
  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)>'
conta = Conta.new('2303-2', Cliente.new('José da Silva', nil, nil), 1000.10, 500)
p conta.kind_of(Cliente) # true
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"