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
相关产品推荐
相关产品推荐

