You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ruby子类Brand实例化参数数量错误问题求助

问题分析

你的错误根源在于继承链的参数不匹配:

  • Brand 继承自 Product,但 Product 的 initialize 方法要求传入5个参数(name, unit, brand, category, price),而 Brand 的 initialize 只接收1个参数,调用 super(brand) 时会直接传递1个参数给父类,导致父类初始化参数不足,触发 expected 5 错误。
  • 当你尝试给 Brand.new 传5个参数时,又会因为 Brand 的 initialize 只定义了1个参数,触发 expected 1 错误。

另外从设计逻辑看,Brand(品牌)和 Product(商品)是关联关系而非继承关系(商品属于某个品牌,而非品牌是一种商品),这才是更合理的面向对象设计,但如果是课程要求必须用继承,可按以下方案修复。


解决方案

方案1:按课程继承要求修复参数匹配

修改 Brand 的初始化方法,给父类 Product 传递占位默认值,同时处理父类中依赖非必要属性的方法:

1.1 修改 Brand.rb 的 initialize

require "#{Dir.pwd}/class/Product"

class Brand < Product
  attr_reader :brand_key, :a_brands, :q_brands
  attr_accessor :brand

  def initialize(brand)
    # 给父类传递占位默认值,满足Product的5参数要求
    super(nil, nil, brand, nil, nil)
    @brand_key = set_brand_key
    @a_brands = get_file.read.split("\n").map { |abrand| abrand.split(',') }
    @q_brands = @a_brands.count
  end

  # 重写父类的set_key,避免name为nil时报错
  def set_key
    # Brand不需要Product的key,返回空或自定义逻辑即可
    ""
  end

  def set_brand_key
    "#{@q_brands}#{self.brand[0..2].upcase}3BS"
  end

  def get_file
    File.open("#{Dir.pwd}/db/catalogo_marca.txt")
  end

  def alta_brand
    get_file.write("#{@brand_key},#{@brand}\n", mode: 'a')
  end
end

1.2 验证调用

现在可以正常用单个参数创建Brand实例:

brand = Brand.new("Nike")
brand.alta_brand # 正常写入品牌文件

方案2:优化继承关系(更符合面向对象设计)

如果课程允许调整继承逻辑,让 Brand 直接继承 DBHandler(而非 Product),彻底避免参数冲突:

2.1 修改 Brand.rb

require "#{Dir.pwd}/class/DBHandler"

class Brand < DBHandler
  attr_reader :brand_key, :a_brands, :q_brands
  attr_accessor :brand

  def initialize(brand)
    super() # 调用DBHandler的初始化(如果DBHandler需要参数请对应调整)
    @brand = brand
    @a_brands = get_file.read.split("\n").map { |abrand| abrand.split(',') }
    @q_brands = @a_brands.count
    @brand_key = set_brand_key
  end

  def set_brand_key
    "#{@q_brands}#{self.brand[0..2].upcase}3BS"
  end

  def get_file
    File.open("#{Dir.pwd}/db/catalogo_marca.txt")
  end

  def alta_brand
    get_file.write("#{@brand_key},#{@brand}\n", mode: 'a')
  end
end

2.2 调整 init.rb 的引用顺序

确保先加载父类再加载子类:

require './class/DBHandler'
require './class/Product'
require './class/Brand'
require './class/Category'

内容的提问来源于stack exchange,提问作者Mauricio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 17:55:15