Vb.net 如果只知道接口/抽象类,如何从具体实现中获得不同的值类型?
我正在使用的内容:Vb.net 如果只知道接口/抽象类,如何从具体实现中获得不同的值类型?,vb.net,oop,.net-3.5,polymorphism,Vb.net,Oop,.net 3.5,Polymorphism,我正在使用的内容: VB.NET、NET3.5、OpenXMLSDK2.0 我想做什么: 我正在为我的应用程序(基于OpenXMLSDK2.0)创建一个xlsx读写器。我想读取xlsx文件并将每行中包含的数据存储在DTO/PONO中。此外,我想读取xlsx文件,然后修改并保存它 我的想法: 现在我的问题不在于OpenXMLSDK,我可以做我需要做的事情 我的问题是如何构造我的组件。具体地说,我在电子表格的最底层,即单元格中遇到了多态性问题 Excel/OpenXML中的单元格可以有不同类型的相关
VB.NET、NET3.5、OpenXMLSDK2.0 我想做什么:
我正在为我的应用程序(基于OpenXMLSDK2.0)创建一个xlsx读写器。我想读取xlsx文件并将每行中包含的数据存储在DTO/PONO中。此外,我想读取xlsx文件,然后修改并保存它 我的想法:
现在我的问题不在于OpenXMLSDK,我可以做我需要做的事情 我的问题是如何构造我的组件。具体地说,我在电子表格的最底层,即单元格中遇到了多态性问题 Excel/OpenXML中的单元格可以有不同类型的相关数据。例如时间、日期、数字、文本或公式。当从电子表格读取/写入数据时,需要对这些不同类型的数据进行不同的处理 我决定为所有子类型(如TextCell、NumberCell、DateCell等)提供一个通用接口 现在,当我从电子表格中读取单元格时,方法/工厂可以决定创建哪种类型的单元格 现在,由于单元是实际实现的抽象,它不知道/不需要知道它是什么类型。对于写入/修改单元格,我通过在要持久化的单元格上调用.write(ICellWriter)来解决此问题。由于单元本身知道它包含什么类型的数据,所以它知道需要调用哪个ICellWriter方法(静态polymorpism) 我的问题:
写入xlsx文件没有问题。我的问题是,如何在不进行类型检查的情况下将单元格中的数据输入DTO/PONO->
如果变量的类型为ClassX,则在变量的类型为ClassX时结束。由于方法/属性必须具有不同的签名,因此不允许仅使用不同的返回类型进行区分
编辑:
对象的持有者(集合,在本例中是表格/电子表格的一行)不知道具体的实现。所以写手机的时候,我会传给手机写手。此Cellwriter具有重载方法,如Write(num为整数)
,Write(文本为字符串)
,Write(数据为日期)
。将此信息传递给它的cell对象然后使用其持有的数据类型调用Write()
方法。这是有效的,因为没有返回值
但是,当我需要返回具体的数据类型时,我该怎么办
有什么想法、建议、见解吗
谢谢
编辑:
词汇表:
- DTO:数据传输对象
- PONO:普通的旧.Net对象
- xlsx:指excel工作簿文件的文件结尾
编辑:
单元“子类型”实现一个公共接口,不从公共超类继承
编辑:
经过对这个问题的思考,我意识到如果不思考或者不知道我期望的是什么类型的细胞,这是不可能的。基本上,我试图重新创建一个电子表格或类似的功能和方式太抽象/配置我的需要。感谢您花时间和精力写下答案。我接受了最接近我意识到的答案。我认为你做不到
如果我理解正确的话,您有不同类型的单元格(StringCell、IntCell),每个具体类都返回一个“object”类型的对象。当您使用基类“Cell”并获取其值时,它属于Object类型
将其作为字符串、整数或日期等使用。。。我认为你需要以这样或那样的方式检查那物体的类型。你可以像你演示的那样使用TypeOf;我还看到了基类上的“.GetValueAsString()/.GetValueAsInteger()”之类的内容。但是您仍然需要足够的知识来说'Dim myInt as Integer=myCell.GetValueAsInteger()'
一般来说,至少如果你认同可靠的原则,你就不应该在意
它指出,在计算机程序中,如果S是T的子类型,则T类型的对象可以替换为S类型的对象(即,S类型的对象可以替代T类型的对象),而不改变该程序的任何期望属性(正确性、执行的任务等)
如果您有细胞的子类型,但不能互换使用,那么不使用继承是一个很好的选择
我不知道您打算如何处理单元格中的值,这些值要求您使用具体类,而不是使用基类;但也有可能在基础本身中公开该功能。IE-如果你需要添加两个单元格,你可以将它们作为通用单元格来处理(也许。至少如果它们是兼容类型的),而不知道它们是什么子类型。无论如何,您都应该能够返回DTO中的基类
至少,我认为这是我的理解。在听我讲话之前,我当然会等更多的人加入进来 我在问题的末尾添加了一个词汇表,希望对您有所帮助。我知道这并不能直接回答问题,但您为什么不使用ado.net阅读excel文件呢?有没有什么特殊情况让你不能这么做?@Dom:也许ado.net可以作为一个选项:)。能否使用ado.net修改“命名范围”的引用?我认为ado.net在向工作表中插入新行时将使用正确的格式。我使用的扩展方法将writer作为第一个参数。然后,我简单地为可能进入的每种类型的数据创建了一个函数。{Decimal、Double和Float}称为公共私有WriteCell;串起另一个;日期时间等等。然后我对枚举使用了泛型public WriteCell(T的结构,IConvertable…)。最通用的是WriteCell(writer,obj As Object,rowIndex,columnIndex,可选的styleIndex)