当我处理类和对象时,我总是感到困惑。当我试图理解Spreadsheet::ParseExcel
模块时,我对它的类和对象有一些疑问:
我怀疑是:
使用$parser= Spreadsheet::ParseExcel->new();
,我们正在为Spreadsheet::ParseExcel
创建一个对象,然后我们将为Spreadsheet::ParseExcel::Workbook
创建一个对象。
为什么我们不能直接为Spreadsheet::ParseExcel::Workbook
创建对象并开始解析?
谢谢
答案 0 :(得分:4)
为什么我们不能直接为Spreadsheet :: ParseExcel :: Workbook创建对象并开始解析
这是一个合理的问题,在旧版本的Spreadsheet :: ParseExcel中,有一个Spreadsheet::ParseExcel::Workbook->Parse()
方法可以做到这一点。 (*)
用户倾向于仅将Excel文件视为工作簿。但是,文件格式还包含与工作簿数据分开的元数据(作者,创建日期等)和vba宏等数据。
因此,解析器与工作簿的逻辑划分可能是由于文件中数据的物理划分而发生的。
或者可能是允许报告文件解析错误,而不仅仅是返回未定义的工作簿对象。
无论哪种方式,其他人可能选择以不同方式对界面进行建模,但这是原作者选择的。它并不完全直观但有效。
(*)此方法现已弃用,因为它不允许对文件进行错误检查。
答案 1 :(得分:2)
考虑Spreadsheet::ParseExcel
和Spreadsheet::ParseExcel::Workbook
,它们只是不同的类型,如整数和字符串,它们都是标量,但你不能,比如说,它们相乘,尽管它们可以在某些情况下相互作用。例如。 length()
应用于字符串会给出整数字符串长度。同样,Spreadsheet::ParseExcel::parse()
会为您提供Spreadsheet::ParseExcel::Workbook
。它们受公共命名空间的约束,但它们完全不同,Spreadsheet::ParseExcel
是解析器,Spreadsheet::ParseExcel::Workbook
是工作簿。