0

当我处理类和对象时,我总是感到困惑。当我试图理解该 Spreadsheet::ParseExcel模块时,我对它的类和对象有一些疑问:

我的疑问是:

使用$parser= Spreadsheet::ParseExcel->new();,我们正在为 创建一个对象Spreadsheet::ParseExcel,之后我们将为 创建一个对象Spreadsheet::ParseExcel::Workbook
为什么我们不能直接创建对象 Spreadsheet::ParseExcel::Workbook并开始解析?

谢谢

4

2 回答 2

4

为什么我们不能直接为 Spreadsheet::ParseExcel::Workbook 创建对象并开始解析

这是一个合理的问题,在旧版本的 Spreadsheet::ParseExcel 中有一种Spreadsheet::ParseExcel::Workbook->Parse()方法可以做到这一点。(*)

用户倾向于仅将 Excel 文件视为工作簿。但是,文件格式还包含元数据(作者、创建日期等)和与工作簿数据分开的 vba 宏等数据。

因此,解析器与工作簿的逻辑划分可能是由于文件中数据的物理划分而发生的。

或者可能是允许报告文件解析错误,而不仅仅是返回未定义的工作簿对象。

无论哪种方式,其他人可能选择了不同的界面建模,但这是原作者选择的。它并不完全直观,但它确实有效。

(*) 此方法现已弃用,因为它不允许对文件进行错误检查。

于 2012-09-18T12:22:59.557 回答
2

想一想它们只是不同的类型Spreadsheet::ParseExcelSpreadsheet::ParseExcel::Workbook比如整数和字符串,它们都是标量,但是你不能,比如说,将它们相乘,尽管它们在某些情况下可以交互。例如length()应用于字符串为您提供整数长度的字符串。同样的方式,Spreadsheet::ParseExcel::parse()给你Spreadsheet::ParseExcel::Workbook。它们由公共命名空间绑定,但它们完全不同,Spreadsheet::ParseExcel既是解析器,又Spreadsheet::ParseExcel::Workbook是工作簿。

于 2012-09-18T09:44:05.257 回答