2011-02-28 86 views
3

我使用的是什么:
VB.NET,NET 3.5,OpenXML的SDK 2.0如果只知道接口/抽象类,如何从具体实现中获取不同的值类型?

我想做的事:
我创造了我的应用程序的XLSX读/写器(基于OpenXML的SDK 2.0)。我想读取xlsx文件并将包含在每行中的数据存储在DTO/PONO中。此外,我想读取xlsx文件,然后修改并保存它。

我的想法:
现在我的问题是不是与OpenXML的SDK,我可以做我需要做的。

我的问题是如何构建我的组件。具体而言,我在电子表格的最低级别单元格处遇到多态性问题。

Excel/OpenXML中的单元格可以具有与其关联的不同类型的数据。像时间,日期,数字,文字或公式。从电子表格读取/写入时,需要对这些不同的类型进行不同的处理。

我决定像TextCell,NumberCell,DateCell等

所有亚型的通用接口现在,当我从电子表格中读取电池的方法/工厂可以决定创建哪种类型的细胞。

现在因为单元是真实实现的抽象,所以它不知道/不需要知道它是什么类型。对于编写/修改单元格,我通过在要保存的单元格上调用.write(ICellWriter)来解决此问题。由于单元本身知道它包含的是什么类型的数据,它知道它需要调用哪种ICellWriter方法(静态polymorpism)。

我的问题:
写入到XLSX文件是没有问题的。我的问题是,如何将数据从我的单元转移到我的DTO/PONO中,而无需通过类型检查 - >If TypeOf variable is ClassX then doesomething End If。由于方法/属性必须具有不同的签名,并且仅通过使用不同的返回类型进行区分是不被允许的。

编辑:

的对象(指的细胞)不知道具体实现的持有人(集合,在这种情况下,表/电子表格的行)。所以为了编写一个单元格,我把它传给了一个Cellwriter。这台Cellwriter的重载方法如Write(num as Integer),Write(text as String),Write(datum as Date)。传递给它的单元对象然后使用它所保存的数据类型调用Write()方法。这是有效的,因为没有返回值被传回。

但是当我需要返回的具体数据类型时该怎么办?

任何想法,建议,见解?

感谢

编辑:
名词解释:

  • DTO:数据Transfere对象
  • PONO:传统.NET对象
  • XLSX:指文件的Excel工作簿的结局文件

编辑:
细胞“亚型”实现一个通用的接口,并不从一个共同的超类继承。

编辑:
经过对这个问题的一些思考后,我开始意识到,如果没有反思或知道我期待的是什么类型的细胞,这是不可能的。基本上我试图重新创建一个电子表格或类似的功能和方式太抽象/配置为我的需要。感谢您的时间&努力写出答案。我接受了最接近我意识到的答案。

+0

PONO代表什么? – 2011-02-28 10:51:06

+0

我在我的问题结尾添加了词汇表,希望有所帮助。 – Chipmunk 2011-02-28 11:02:37

+0

我知道这并不直接回答这个问题,但为什么不使用ado.net读取excel文件呢?有什么特殊情况,为什么你不能这样做? – Dom 2011-02-28 15:40:22

回答

0

我不认为你可以。

如果我理解正确,你有不同类型的单元格(StringCell,IntCell),每个具体的类都返回一个类型为'Object'的对象。当你使用基类“Cell”并获取它的值时,它是Object类型的。

以字符串,整数或日期等形式使用它...我认为您需要以某种方式检查该对象的类型。你可以像你演示的那样使用TypeOf;我还在基类中看到了诸如'.GetValueAsString()/。GetValueAsInteger()'之类的东西。但你仍然需要足够的知识来说'Dim myInt as Integer = myCell.GetValueAsInteger()'

一般来说,至少如果你订阅了SOLID主体,你不应该在意。

对类型T的对象

它指出,在计算机程序中,如果S是T的子类型,则类型T的对象可以与S型的对象来代替(即,S型的对象可以是替代),在不改变任何程序的理想特性(正确性,执行任务等)的

http://en.wikipedia.org/wiki/Liskov_substitution_principle

如果你有细胞亚型,但你不能交替使用它们,这是一个不使用继承的好人选。

我不知道你打算如何处理单元格中的值,这需要你具有具体的类而不是使用基类;但它可能会在基础本身中公开该功能。 IE - 如果你需要添加两个单元格,你可以完成那些将它们视为通用单元格(可能至少提供它们是兼容类型),而不知道它们是什么子类型。无论如何,您应该能够返回DTO中的基类。

至少,我这是我的理解。在听我之前,我肯定会等待更多的人加入。

+0

在这种情况下。制作一个包含所有东西的对象直到最后,当它被处理时,都是最好的方法。因为他使用SAX,它将xml blobx写入zip文件(幕后);自定义类对象非常擅长一次全部序列化;而Xml和OO有1对1的关系,继承是一个好的途径。由于xml和OO之间的密切关系,我不会打扰SOLID /组合。 – TamusJRoyce 2011-07-16 16:29:50

相关问题