如何从仅有接口/抽象类的具体实现中获取不同的值类型是众所周知的?

时间:2011-02-28 10:45:10

标签: vb.net oop .net-3.5 polymorphism

我正在使用的内容:
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方法(静态多态)。

我的问题:
写入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:数据传输对象
  • PONO:Plain Old .Net Object
  • xlsx:指的是excel工作簿文件的文件结尾

编辑:
Cell“subtypes”实现了一个通用接口,并且不从公共超类继承。

编辑:
在对这个问题进行一些思考之后,我开始意识到,如果没有反思或了解我期待的细胞类型,就不可能。基本上我试图重新创建一个电子表格或具有类似功能的东西,并且根据我的需要过于抽象/可配置。谢谢你的时间和努力写下答案。我接受了与我意识到的最接近的答案。

1 个答案:

答案 0 :(得分:0)

我认为你不能。

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

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

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

  

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

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

如果您有细胞的亚型,但不能互换使用它们,那么它是不使用继承的良好候选者。

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

至少,我是我的理解。在听我说话之前,我肯定会等待更多的人来。