Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 如果只知道接口/抽象类,如何从具体实现中获得不同的值类型?_Vb.net_Oop_.net 3.5_Polymorphism - Fatal编程技术网

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)