我有 3 個通過繼承相關的類(這是一個課程練習)
我有一Brand < Product < DBHandler堂課
它們位于專案的子檔案夾中,并且它們都使用 require 來相互訪問:
├── class
│ ├── Brand.rb
│ ├── Category.rb
│ ├── DBHandler.rb
│ └── Product.rb
├── db
│ ├── catalogo_categorias.txt
│ ├── catalogo_marca.txt
│ ├── catalogo_producto.txt
│ └── inventario_final.txt
├── init.rb
└── README.md
類
產品檔案中有:
require "#{Dir.pwd}/class/DBHandler"
class Product < DBHandler
attr_reader :key, :final_price, :db
attr_accessor :name, :unit, :brand, :category, :price
def initialize(name, unit, brand, category, price)
@name = name
@unit = unit
@brand = brand
@category = category
@price = price
@final_price = set_final_price
@db = DBHandler.new
@key = set_key
end
def set_key
@key = "#{@db.how_many 1}#{self.name[0..2].upcase}3BS"
end
def set_final_price
@final_price = self.price * 1.19
end
def search_product(search_expresion)
@db.db_search(search_expresion)
end
def alta_product
@db.write(
"#{key},#{name},#{unit},#{brand},#{category},#{price},#{final_price}\n"
)
end
end
品牌檔案有:
require "#{Dir.pwd}/class/Product"
class Brand < Product
attr_reader :brand_key, :a_brands, :q_brands
attr_accessor :brand
def initialize(brand)
# use super to use parent's attributes
super(brand)
@brand_key = set_brand_key
@a_brands = get_file.read
.split("\n")
.map { |abrand| abrand.split(',') }
@q_brands = @a_brands.count
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}", mode: 'a')
end
end
初始化檔案
從檔案中呼叫所有檔案init.rb以呼叫一些實體方法。
這是我的Init.rb檔案第一行。
require './class/Product'
require './class/Brand'
require './class/DBHandler'
require './class/Category'
問題
當我想創建一個新的Brand類實體時,我嘗試過:
brand = Brand.new(name, unit, brand, category, price)它回傳wrong number of arguments (given 5, expected 1) (ArgumentError)brand = Brand.new(brand)它回傳wrong number of arguments (given 1, expected 5) (ArgumentError)
我不知道我做錯了什么。我需要創建一個只有brand引數的 Brand 實體
uj5u.com熱心網友回復:
你的問題在這里
super(brand)
這就是說“呼叫父建構式brand作為唯一的引數”。父建構式是Product#initialize,它接受五個引數。因此,無論您如何呼叫Brand#initialize,它都會失敗,因為它Product#initialize使用錯誤數量的引數進行呼叫。您需要super與所有五個人一起打電話。
但我挑戰框架。子類化是一種非常緊密的耦合,一種“is-a”關系。你所聲稱的是每個品牌都是一種產品,我看不出這是真的。因此,與其修復super呼叫,您可能會重新考慮您的設計并問自己是否真的打算創建一個子類。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/523029.html
標籤:红宝石班级遗产
上一篇:從父類實體創建子類實體
