簡體   English   中英

如果只知道接口/抽象類,如何從具體實現中獲取不同的值類型?

[英]How to get differing value type out of an concrete implementation if only Interface / abstract class is known?

我在用什么:
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:普通的舊.Net對象
  • xlsx:指的是excel工作簿文件的文件結尾

編輯:
Cell“subtypes”實現了一個公共接口,並且不從公共超類繼承。

編輯:
在對這個問題進行一些思考之后,我開始意識到,如果沒有反思或了解我期待的細胞類型,就不可能。 基本上我試圖重新創建一個電子表格或具有類似功能的東西,並且根據我的需要過於抽象/可配置。 感謝您花時間和精力寫下答案。 我接受了與我意識到的最接近的答案。

我認為你不能。

如果我理解正確,你有不同類型的單元格(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

如果您有單元格的子類型,但不能互換使用它們,那么它是不使用繼承的好選擇。

我不知道你打算如何處理單元格中的值,這些值需要你擁有具體的類而不是使用base; 但是有可能在基礎本身中公開該功能。 IE - 如果你需要添加兩個單元格,你可以完成將它們視為通用單元格(可能。至少提供它們是兼容的類型),而不知道它們是什么子類型。 無論如何,您應該能夠在DTO中返回基類。

至少,我是我的理解。 在聽我說話之前,我肯定會等待更多的人來。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM